On 06/30/2010 09:28 PM, p...@mail.python.org wrote: > I have a problem with threading using the Python/C API. I have an > extension that implements a timer, and the C++ timer callback function > calls a Python function. The relevant code looks like this: > > [snip] > > static void CALLBACK PeriodicTimer(UINT wTimerID, UINT msg, > DWORD dwUser, DWORD dw1, DWORD dw2)
This looks frightfully WIN32. How are you calling a timer? I'm guessing you're using some win32 function. So my tentative tip on where the problem might lie is the interaction of Python's PyThreads and the win32 threading primitives you're probably calling. > { > PyGILState_STATE pgs; > > pgs = PyGILState_Ensure(); > if(attrsetFlag) > { > pres = PyObject_CallFunction(attr,NULL); > if( pres == NULL )printf("CallFunction failed!\n"); > } > PyGILState_Release( pgs ); > > } > > The Python code that sets this up looks like this: > > fetimer.setmodname("Timeslice3") > fetimer.setprocname("Timetester") I'm sure this isn't the problem, but why aren't you just passing in an object? As in fetimer.setcallable(Timeslice3.Timetester)? > [ snip ] > > Fatal Python Error: This thread state must be current when releasing > > Fatal Python Error: PyThreadState_DeleteCurrent: no current tstate > > Fatal Python Error: PyEval_SaveThread: NULL tstate As I said, I'd expect there to be some irregularities between what PyThreads would normally do and what you're doing in the code you didn't post. > > Can anybody help me make this code stable, so that it works all the > time? I can't really help you - I have limited experience with the C API, let alone Python/C threading, and know next to nothing about Windows programming. Maybe you should ask in a more specialized (and quieter) forum, such as the CAPI-SIG mailing list, or python-win32. -- Thomas -- http://mail.python.org/mailman/listinfo/python-list