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

Reply via email to