Threading module and embedded python
Barry Scott
barry at barrys-emacs.org
Thu Apr 16 12:32:58 EDT 2020
> On 16 Apr 2020, at 14:55, Eko palypse <ekopalypse at gmail.com> wrote:
>
> Barry, sorry for sending you a private message yesterday, was not intended.
>
> No, I only have rudimentary knowledge of C++,
> but it has been developing since I started using Cython.
> I haven't done any stack analysis yet but hey, there's always a first time.
> I think my stubbornness could be of help here :-)
Its a very useful when the simple debug stuff fails.
>
> Visual Studio reports that the last location of the thread is in _ctypes.pyd
> and the call stack window shows that the last execution is
> user32.dll!InternalDailogBox().
>
> Call Stack
>
>
> *user32.dll!InternalDialogBox()user32.dll!DialogBoxIndirectParamAorW()user32.dll!DialogBoxIndirectParamW()_ctypes.pyd!000007fee7fc17e3()_ctypes.pyd!000007fee7fbfee3()_ctypes.pyd!000007fee7fbb4c5()_ctypes.pyd!000007fee7fbc019()_ctypes.pyd!000007fee7fb6dfa()python37.dll!_PyObject_FastCallKeywords(_object
> * callable=0x0000000002fa8c78, _object * const * stack=0x0000000005261c78,
> __int64 nargs=5, _object * kwnames=0x0000000000000000)*
My guess is that you are missing an important parameter to the dialog that allows it be seen.
Test the dialog code outside of the embedded python, with a command line python.
I recall that you have to pass in the parent for a dialog. Maybe in the embedded version
you do not have an HWND that is usable, can NULL be used?
Is there a SHOW arg that you need to pass?
I'd check the MSDN docs for the call you are making and check every param is as required.
(Its been a along time since I did low level win32 in anger so forgive the lack of solutions)
>
>
> The thread is neither suspended nor does it have any different status than
> the main thread
> which loops through its main event queue at this point.
It is suspended inside the user32.dll.
Barry
>
> Thank you
> Eren
>
>
> Am Mi., 15. Apr. 2020 um 22:57 Uhr schrieb Barry <barry at barrys-emacs.org>:
>
>>
>>
>>> 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
>>>
>>
>>
> --
> https://mail.python.org/mailman/listinfo/python-list
More information about the Python-list
mailing list