Erstes Modul (Threading)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Freitag 15. September 2006, 23:07

Hey ... da ich mitbekommen musste, dass das Threading, welches vom "threading"-Modul bereitgestellt wird, nicht wirklich was taugt, hab ich das gleich zum Anlass genommen, selber eins zu schreiben... da das gleichzeitig mein erstes Modul ist und ich auch noch nicht ganz mit den Ref-Countern durchsehe, bitte ich euch, mal einen Blick drauf zu werfen und mir zu sagen, ob ich da einen Bug gebaut habe.

Code: Alles auswählen

/*
 * This is a python module implementing real threads.
 */
#include <Python.h>
#include <pthread.h>

/**
 * Callback for the thread. Just calls the argument's python function.
 */
static void * thread_cb (void * arg)
{
	PyObject * arglist;

	arglist = Py_BuildValue("()",NULL);
	PyEval_CallObject((PyObject*)arg, arglist);
    Py_DECREF(arglist);
	Py_DECREF((PyObject*)arg);

	return NULL;
}

/**
 * Function called from the python application.
 */
static PyObject * thread_start (PyObject * self, PyObject *args)
{
	PyObject *temp;
	pthread_t ID;

    if (PyArg_ParseTuple(args, "O:thread_start", &temp))  // get argument
	{
        if (!PyCallable_Check(temp)) // not callable
		{
            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
            return NULL;
        }
        Py_INCREF(temp);         /* Add a reference to new callback */
		int status = pthread_create(&ID, NULL, thread_cb, (void*) temp);
		if (status)
		{
			PyErr_SetString(PyExc_SystemError, "error during thread start");
			return NULL;
		}
    }
	
	Py_RETURN_NONE;
}

static PyMethodDef ThreadMethods[] = {
    {"thread_start",  thread_start, METH_VARARGS,
     "Start a new thread."},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

/**
 * Init function.
 */
PyMODINIT_FUNC
initgeneticthread(void)
{
    (void) Py_InitModule("geneticthread", ThreadMethods);
}
Funktionsweise: Im Pythoncode ruft man denn "thread_start(func)" auf - und das Modul startet denn einen neuen Thread und lässt dort "func()" laufen (keine Argumentübergabe möglich)

Aber ich denke mir, dass das ja nicht so einfach sein kann ... sonst hätte das schon längst jmd gebaut 8)
Inter Deum Et Diabolum Est!
BlackJack

Samstag 16. September 2006, 09:22

Necoro hat geschrieben:Hey ... da ich mitbekommen musste, dass das Threading, welches vom "threading"-Modul bereitgestellt wird, nicht wirklich was taugt, hab ich das gleich zum Anlass genommen, selber eins zu schreiben...

[...]

Aber ich denke mir, dass das ja nicht so einfach sein kann ... sonst hätte das schon längst jmd gebaut 8)
Vielleicht kommen alle anderen auch mit dem `threading` Modul zurecht...
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Sonntag 17. September 2006, 18:35

Das Threading-Modul will bei mir aber nicht so, wie es soll:

Problem: Ich habe eine gtk-Oberfläche - und ich denke die zugehörige main-methode ist allergisch gegen threading. Der Thread wird nur ausgeführt, wenn ich etwas mache, was die gtk.main() zum innehalten bringt (zB irgendwo etwas länger auf der Festplatte rumkramen) ... und das ist nicht sinn der sache
Inter Deum Et Diabolum Est!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 17. September 2006, 18:39

Necoro hat geschrieben:Problem: Ich habe eine gtk-Oberfläche - und ich denke die zugehörige main-methode ist allergisch gegen threading.
Ja ist sie, zumindest mehr oder weniger. Daher musst du threads_enter() und threads_leave() verwenden, wie hier beschrieben. Allerdings bevorzuge ich persönlich die GTK+-Pseudothreads zu verwenden, die Funktionieren schön einfach und eben auch wunderbar mit GTK+.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Sonntag 17. September 2006, 19:03

oi danke ... die FAQ in dem verlinkten Thread haben geholfen :)

da mein Thread nix im GUI machen soll, hab ich vor der main einfach gobject.threads_init() gestartet ... und das Threading will wieder :) *freu* *sein eigenes Modul in die Tonne klopf*
Inter Deum Et Diabolum Est!
Antworten