ale*_*p86 0 c++ qt multithreading qthread
这是QThread的子类的run方法:
void crono::Controller::run() {
//initialise timer
int *i = & this->model->seconds_elapsed;
for (*i = 0; *i < this->model->seconds_total; (*i)++) {
//calculate current seconds/minutes/hours elapsed starting from seconds_elapsed (*i)
this->model->tick();
//should display in the form the time elapsed
this->vista->showTime();
sleep(1000);
}
Beep(1000, 500); //beep when all is over
}
Run Code Online (Sandbox Code Playgroud)
控制器更新模型值.
QT表单在启动时打开,我猜在主应用程序线程中.
问题是对debug*i = 0和seconds_total = X> 0的鄙视,循环只执行一次,在第一次调试停止(它没有结束)之后,表单弹出但没有任何反应.
我唯一可以猜到的是,Controller Thread失去了优先级,再也没有获得cpu.
怎么能避免这个?
编辑 我正在尝试使用QTimer,运气不好.
我将更新声明为公共插槽,然后实现如下:
void crono::Controller::update() {
this->modello->tick();
this->vista->showTime();
//eventually stop at some point (pointer to timer and timer->stop()?
//...
//Beep(1000, 500);
}
Run Code Online (Sandbox Code Playgroud)
我将QTimer插入控制器(线程)对象而不是循环周期:
void crono::Controller::run() {
//inizializzo timer
int *i = & this->modello->secondi_trascorsi;
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()),this, SLOT(update()));
timer->start(1000);
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但是从不调用update()方法,而是被无限次调用.为什么?
常见的困惑是QThread在自己独立的线程中运行.不是这种情况; 相反,QThread它在它控制的子线程中启动一个事件循环.QThread很容易被称为QThreadManager.
简而言之,不要子类化QThread,因为您创建的功能驻留在主线程(而不是QThread处理的线程)中.创建一个QObject子类,其中一个插槽连接到started()信号.然后使用moveToThread()并调用run()您的QThread实例.
此外,您不能直接从子线程调用主线程函数.您需要一个排队的连接信号到主线程中的对象以显示该对话框.