Embedded Python und Thread Problem
Verfasst: Montag 15. Mai 2006, 10:37
Hallo allerseits,
ich habe eine Anwendung, die Python als eingebettete Scriptsprache nutzt. Dazu wird in einem vordefinierten Python Script eine Funktion "start" definiert, die von meiner Anwendung gerufen wird.
Die Ausführung dieses Aufrufs liegt wiederum in einem eigenen C-Thread, damit meine Anwendung nicht blockiert wird während der Ausführung des Scripts.
Der Code im C-Thread sieht so aus:
Das Programm läuft soweit im Release Mode auch sehr gut, im Debug Modus stürtz es allerdings regelmässig ab mit der Fehlermeldung: "Fatal Python error: Invalid thread state for this thread"
Der Absturz kommt aus der Python Library aus dieser Funktion:
Durch die Zeile
Es scheint so, als würde sich Python darüber beschweren, dass es für diesen Thread mehrere Thread-States gibt. Die Frage ist aber, wer erstellt noch neue Thread-States für meinen Thread? Und warum ist das für Python ein Problem?
Weiterhin ist dabei seltsam, dass der obige Code immer einmal fehlerfrei ausgeführt wird. Danach tritt der Fehler abhängig vom Script auf.
Besteht das Script z.B. nur aus der Zeile:
Ich hoffe, ihr könnt mir da irgendwie weiterhelfen.
ich habe eine Anwendung, die Python als eingebettete Scriptsprache nutzt. Dazu wird in einem vordefinierten Python Script eine Funktion "start" definiert, die von meiner Anwendung gerufen wird.
Die Ausführung dieses Aufrufs liegt wiederum in einem eigenen C-Thread, damit meine Anwendung nicht blockiert wird während der Ausführung des Scripts.
Der Code im C-Thread sieht so aus:
Code: Alles auswählen
UINT ScriptThreadProc(LPVOID lParam)
{
bool error = false;
ScriptThreadData * std = (ScriptThreadData*) lParam;
PyObject *pStart = std->mainScriptMethod;
PyObject * runObject = 0;
// Create new Threadstate object
PyThreadState * tstate = PyThreadState_New(std->sc->m_pMainInterpreterState);
// Swap in my Threadstate
PyEval_AcquireLock();
PyThreadState * temp = PyThreadState_Swap(tstate);
// The script execution is started here
if(pStart && PyCallable_Check(pStart))
{
runObject = PyObject_CallObject(pStart, NULL); // call the "start" function in the python script
}
if(runObject)
Py_DECREF(runObject); // clear the object, if script execution finished
PyEval_ReleaseThread(tstate); // release the current thread state and reset it to NULL
// clear and free the thread state
PyEval_AcquireLock();
PyThreadState_Clear(tstate);
PyThreadState_Delete(tstate);
PyEval_ReleaseLock();
return 0;
}
Der Absturz kommt aus der Python Library aus dieser Funktion:
Code: Alles auswählen
PyThreadState *
PyThreadState_Swap(PyThreadState *new)
{
PyThreadState *old = _PyThreadState_Current;
_PyThreadState_Current = new;
/* It should not be possible for more than one thread state
to be used for a thread. Check this the best we can in debug
builds.
*/
#if defined(Py_DEBUG) && defined(WITH_THREAD)
if (new) {
PyThreadState *check = PyGILState_GetThisThreadState();
if (check && check != new)
Py_FatalError("Invalid thread state for this thread");
}
#endif
return old;
ist auch klar, warum der Absturz nur im Debugmode auftritt.#if defined(Py_DEBUG) && defined(WITH_THREAD)
Es scheint so, als würde sich Python darüber beschweren, dass es für diesen Thread mehrere Thread-States gibt. Die Frage ist aber, wer erstellt noch neue Thread-States für meinen Thread? Und warum ist das für Python ein Problem?
Weiterhin ist dabei seltsam, dass der obige Code immer einmal fehlerfrei ausgeführt wird. Danach tritt der Fehler abhängig vom Script auf.
Besteht das Script z.B. nur aus der Zeile:
stüzt es bereits bei der zweiten Ausführung ab, aber bei der Zeile:x = ' ' *2000000
stürzt es erst bei der dritten Ausführung ab. Und das sicher reproduzierbar.print "hallo"
Ich hoffe, ihr könnt mir da irgendwie weiterhelfen.