Встроенные потоки Python завершаются рано при вызове из C ++ с использованием boost :: python - PullRequest
0 голосов
/ 05 июня 2019

Я создаю приложение на 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.

...