<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2719.2200" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hi,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>I am developping a C++ application and I want to 
embedd python. I have succeeded to export my C++ classes and data using SWIG 
then I was able to create multithreading call to python and now I have my app 
running several script at the same time (~). However, I am stack as I would like 
to be able to pause and resume my python script from C++ side. </FONT></DIV>
<DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>If we imagine a looping script, my C++ thread in 
still in the Py_Run_SimpleString() method, and I would like to pause it inside 
python.</FONT></DIV>
<DIV> </DIV>
<DIV>I have try to go directly inside the Interpreter state with all the thread 
queue but it seem that I don't understand how python access to data since I have 
set to NULL some thread state and my script continue to run as it.</DIV>
<DIV> </DIV>
<DIV>If someone can give me a hint how to block a python script directly from 
C++, it would help me a lot.</DIV></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2>A second problem is that when I try to redirect the 
sys.stderr and sys.stdout from python (create a python class which has a write 
method, and then which called inside my C++ method), It's working only until a 
certain time then it crash, how can I do a redirection in case of a c++ 
multithreading app? (I have synchronized the C++ method as well))</FONT></DIV>
<DIV> </DIV>
<DIV>Thanks a lot for any help!</DIV>
<DIV> </FONT></DIV></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>So, here is my thread run method:</FONT></DIV>
<DIV><FONT color=#008000></FONT> </DIV>
<DIV><FONT color=#008000>/* Wait for the initialization thread if there is 
one.*/</FONT></DIV>
<DIV>
<P><FONT color=#0000ff>if</FONT> (_initScript != _PythonScriptHandle(NULL))</P>
<P>    _initScript->_thread->join();<FONT 
color=#008000></P></FONT>
<P>PyEval_AcquireLock();</P>
<P>PyInterpreterState *interp = _service->_mainTstate->interp;</P>
<P><FONT color=#008000>// create new PyThreadState only if needed</P></FONT>
<P>JTCThread * currentThread = JTCThread::currentThread();</P>
<P>PyThreadState * tstate;</P>
<P>vhdPythonServiceBody::_Impl::ThreadInfoMap::iterator it = 
_Impl::threadInfoMap.find(currentThread);</P>
<P><FONT color=#0000ff>if</FONT> (it == _Impl::threadInfoMap.end())</P>
<P>{</P>
<P>    vhdPythonServiceBody::_Impl::ThreadInfo threadInfo;</P>
<P>    threadInfo.pyThreadState = PyThreadState_New(interp);</P>
<P>    threadInfo.outputBuffer = <FONT 
color=#008080>""</FONT>;</P>
<P>    it = 
vhdPythonServiceBody::_Impl::threadInfoMap.insert    
(vhdPythonServiceBody::_Impl::ThreadInfoMap::value_type( currentThread, 
threadInfo)).first;</P>
<P>}</P>
<P>tstate = (*it).second.pyThreadState;</P>
<P>PyThreadState_Swap(tstate);</P>
<P></P>
<P><FONT color=#008000>/* Execute the given script.*/</P></FONT>
<P><FONT color=#0000ff>switch</FONT> (PyRun_SimpleString((<FONT 
color=#0000ff>char</FONT>*) _scriptText->cstr()))</P>
<P>{</P>
<P><FONT color=#0000ff>case</FONT> 0:</P>
<P>    _executionResult=RES_OK;</P>
<P><FONT color=#0000ff>    break</FONT>;</P>
<P><FONT color=#0000ff>case</FONT> -1:</P>
<P>    _executionResult=RES_ERROR;</P>
<P><FONT color=#0000ff>    break</FONT>;</P>
<P>}</P>
<P>PyThreadState_Swap(NULL);</P>
<P><FONT color=#008000>// only for internal threads created by vhdPythonService 
(by using send for execution methods)</FONT><FONT color=#0000ff>if</FONT> 
(_bServiceInternalThread)</P>
<P>{</P>
<P><FONT color=#008000>    // Reset the thread state 
structure.</FONT></P>
<P>    PyThreadState_Clear(tstate);</P>
<P><FONT color=#008000>    // Nullify the current thread state, 
release the global </P></FONT>
<P><FONT color=#008000>    // interpreter lock, delete the thread 
state structure.</P></FONT>
<P>    PyThreadState_Delete(tstate);</P>
<P><FONT color=#008000>    // removal of ThreadInfo that was used 
for internal thread</P></FONT>
<P><FONT color=#008000>    // we will not resues it as it was 
only for the internal thread</P></FONT>
<P>     _Impl::threadInfoMap.erase(currentThread);</P>
<P>}</P>
<P></P>
<P>PyEval_ReleaseLock();</P>
<P></P>
<P><FONT color=#008000>/* Notify the service about the termination of the 
thread.</P>
<P>*/</P></FONT>
<P>_service->_notifyTermination(<FONT color=#0000ff>this</FONT>);</P></DIV>
<DIV><FONT face=Arial size=2>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV></BODY></HTML>