Erstes Modul (Threading)
Verfasst: 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.
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
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);
}
Aber ich denke mir, dass das ja nicht so einfach sein kann ... sonst hätte das schon längst jmd gebaut
