Threading module and embedded python
Barry
barry at barrys-emacs.org
Wed Apr 15 16:54:03 EDT 2020
> On 15 Apr 2020, at 21:18, Eko palypse <ekopalypse at gmail.com> wrote:
>
> Thank you for your suggestion. I will give it a try.
>
>> What is the "stuck" thread doing? waiting for a lock?
>
> No, it should open a dialog created with DialogBoxIndirectParamW
> <https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dialogboxindirectparamw>
I assume you are a C++ developer and can look at the stack of the thread.
What is the thread doing? Is it in python code? Is it in windows code?
Barry
> .
>
> Eren
>
>> Am Mi., 15. Apr. 2020 um 20:12 Uhr schrieb Barry Scott <
>> barry at barrys-emacs.org>:
>>
>>
>>
>>>> On 15 Apr 2020, at 13:30, Eko palypse <ekopalypse at gmail.com> wrote:
>>>
>>> Hi everyone,
>>>
>>> the following happens on Windows7 x64 and Python37 x64
>>>
>>> I have a plugin DLL for a C++ application in which Python37 is embedded.
>>> The plugin itself works, except when I want to use the threading module.
>>>
>>> If I start a Python script in my plugin which uses the threading module
>>> I can verify via ProcessExplorer that the thread is started,
>>> but it doesn't do anything (??) and the c++ application doesn't really
>> do anything anymore either.
>>>
>>> Only when I stop the C++ Applikation, the thread becomes active for a
>> short time.
>>> Verified with logging module over time print-outs.
>>>
>>> Apparently I did not understand everything about threads and embedded
>> python.
>>>
>>> Any idea what I'm doing wrong?
>>
>> This is what I typically do.
>>
>> Make sure that you have installed the Python debug files.
>> Now you can use the visual C++ debugger to attach to the process and
>> look at what the threads are doing.
>>
>> I always have the python source code on hand to read as well.
>>
>> This should give you a clue.
>>
>> What is the "stuck" thread doing? waiting for a lock?
>>
>> Barry
>>
>>
>>
>>
>>>
>>>
>>> The whole thing is initialized by the DllMain routine.
>>>
>>>
>>> BOOL APIENTRY DllMain( HANDLE hModule,
>>> DWORD reasonForCall,
>>> LPVOID /* lpReserved */ )
>>> {
>>> switch ( reasonForCall )
>>> {
>>> case DLL_PROCESS_ATTACH:
>>> if (!Py_IsInitialized())
>>> {
>>> PyImport_AppendInittab("Npp", &PyInit_Npp);
>>> Py_InitializeEx(0);
>>> PyEval_InitThreads(); //<- this shouldn't be needed as I
>> understand that it is called by Py_InitializeEx anyway
>>> }
>>> PyImport_ImportModule("Npp");
>>> break;
>>> case DLL_PROCESS_DETACH:
>>> Py_Finalize();
>>> break;
>>>
>>> case DLL_THREAD_ATTACH:
>>> break;
>>>
>>> case DLL_THREAD_DETACH:
>>> break;
>>> }
>>>
>>> return TRUE;
>>> }
>>>
>>> and the code in the plugin which executes the python scripts is this
>>>
>>> cdef void run_code():
>>> try:
>>> global_dict = globals()
>>> if '__name__' not in global_dict or global_dict['__name__'] !=
>> '__main__':
>>> global_dict.update({"__name__": "__main__",})
>>> exec(compile(editor.getText(), '<string>', 'exec'), global_dict)
>>>
>>> except Exception:
>>> MessageBoxW(nppData._nppHandle,
>>> traceback.format_exc(),
>>> 'RUN CODE EXCEPTION',
>>> 0)
>>>
>>> I don't know if this is important, but the DLL is generated by Cython.
>>>
>>> Thank you for reading and stay healthy
>>>
>>> Eren
>>> --
>>> https://mail.python.org/mailman/listinfo/python-list
>>>
>>
>>
> --
> https://mail.python.org/mailman/listinfo/python-list
>
More information about the Python-list
mailing list