Создать новый поток в скрипте Python, который встроен в MFC

Я разработал небольшой инструмент с MFC и Python.
В этой программе я использую C ++ для взаимодействия с Python API.

Я нуждаюсь:

  1. Функция C ++ A вызывает Py_Initialize (), а затем вызывает функцию Python B с помощью Python API.
  2. В сценарии Python функция Python B запускает новый поток Python E, который создаст новый файл и сделает вывод в этот файл.
  3. Затем функция C ++ F вызывает Py_Finalize (). Конец.

Но все работает неожиданно.
B можно вызвать, но E не запустится. После вызова F вызывается Py_Finalize (), затем запускается E и создается новый файл.

Мне интересно, что с этим не так? Кажется, Питон заблокирован C ++. Связано ли это с питоном GIL? Если так, что я должен сделать?

0

Решение

Я решил проблему и хотел бы вставить ее сюда, если кому-то еще это нужно.

  1. После того, как A вызывает Py_Initialize (), PyEval_InitThreads () также необходим.
  2. После того, как A вызывает функцию Python B, GIL должен быть освобожден PyEval_ReleaseThread (PyThreadState_Get ()). Тогда поток E может запускаться.
  3. После того, как E закончится, PyGILState_Ensure () должен быть вызван в C ++, чтобы вернуть блокировку.
0

Другие решения


По вопросам рекламы [email protected]