Seite 1 von 1

Erstes Modul (Threading)

Verfasst: Freitag 15. September 2006, 23:07
von Necoro
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)

Re: Erstes Modul (Threading)

Verfasst: Samstag 16. September 2006, 09:22
von BlackJack
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...

Verfasst: Sonntag 17. September 2006, 18:35
von Necoro
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

Verfasst: Sonntag 17. September 2006, 18:39
von Leonidas
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+.

Verfasst: Sonntag 17. September 2006, 19:03
von Necoro
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*