我有一个C ++应用程序,它使用嵌入式python解释器和Python C API。它可以使用PyRun_SimpleFile和PyObject_CallMethod来评估Python文件和源代码。
现在我有一个python源代码,它有一个工作线程,它继承了threading.Thread并且有一个简单的运行重新实现:
import time
from threading import Thread
class MyThread(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
print "running..."
time.sleep(0.2)
问题是“运行”仅在控制台中打印一次。
如何确保python线程继续与我的C ++应用程序GUI循环并行运行。
提前致谢,
保
答案 0 :(得分:2)
主线程在做什么?它只是将控制权返回给您的C ++应用程序吗?如果是这样,请记住在主线程中不运行任何Python代码时释放GIL(全局解释器锁),否则您的其他Python线程将停止等待GIL被释放。
最简单的方法是使用Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS宏。
请参阅文档:http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
答案 1 :(得分:2)
我遇到了同样的问题并找到了解决方案。我知道线程已经很老了,但万一有人想知道......这是一个代码示例,可以满足您的需求。
#include <Python.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
int main()
{
std::string script =
"import time, threading \n"
""
"def job(): \n"
" while True: \n"
" print('Python') \n"
" time.sleep(1) \n"
""
"t = threading.Thread(target=job, args = ()) \n"
"t.daemon = True \n"
"t.start() \n";
PyEval_InitThreads();
Py_Initialize();
PyRun_SimpleString(script.c_str());
Py_BEGIN_ALLOW_THREADS
while(true)
{
std::cout << "C++" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
Py_END_ALLOW_THREADS
Py_Finalize();
return 0;
}
答案 2 :(得分:1)
尽管此线程很旧,但我认为我的回答可能会对遇到相同问题的其他人有所帮助。
两天前,我在Google上遇到了同样的问题,并找到了这个线程,但是@Reuille的解决方案没有运气。
现在,我想分享一下我刚刚发现的解决方法:您必须运行
app.exec()
在您的Python脚本中,而不是在C ++主函数中。 这是一个奇怪的错误。
编辑:您可以在project上看到我的修复程序的详细信息。