Я создаю приложение на C ++ с графическим интерфейсом, кнопки которого должны выполнять многопоточные функции из класса Python. Две кнопки, которые мне нужны, по сути, «запускают поток python» и «останавливают поток python».
Проблема в том, что boost :: python будет вызывать функцию python, но не позволит потоку python оставаться запущенным после возврата вызова C ++ boost :: python. В результате поток Python заканчивается сразу после запуска. Как мне сохранить эту ветку?
Python Class
import time
import threading
class Ticker():
def __init__(self):
self.is_ticking = False
def start_ticking(self):
self.is_ticking = True
while self.is_ticking:
print(time.ctime())
time.sleep(1.0)
def stop(self):
self.is_ticking = False
self.t.join()
print("ticking stopped")
def start(self):
self.t = threading.Timer(0, self.start_ticking)
self.t.start()
print("ticking started")
Python main
import time
import Ticker as tick
ticker = tick.Ticker()
ticker.start()
time.sleep(10)
ticker.stop()
Хороший вывод Python
ticking started
Tue Jun 4 20:32:05 2019
Tue Jun 4 20:32:06 2019
Tue Jun 4 20:32:07 2019
Tue Jun 4 20:32:08 2019
Tue Jun 4 20:32:09 2019
Tue Jun 4 20:32:10 2019
Tue Jun 4 20:32:11 2019
Tue Jun 4 20:32:12 2019
Tue Jun 4 20:32:13 2019
Tue Jun 4 20:32:14 2019
ticking stopped
C ++ main
#include <boost/python.hpp>
#include <boost/chrono.hpp>
#include <boost/thread/thread.hpp>
int main(int argc, char *argv[]) {
Py_Initialize();
boost::python::object ticker_module = boost::python::import("Ticker");
boost::python::object ticker = ticker_module.attr("Ticker")();
ticker.attr("start")();
boost::this_thread::sleep_for(boost::chrono::seconds(10));
ticker.attr("stop")();
return 0;
}
Плохой вывод C ++
ticking startedTue Jun 4 20:35:17 2019
ticking stopped
Как вы можете видеть выше, main C ++ не выводит 10 ожидаемых временных меток, которые делает main python.