这是 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
}
控制器更新模型值。
QT 表单在启动时打开,我猜是在主应用程序线程中。
问题是鄙视调试 *i=0 和 seconds_total = X > 0,循环只执行一次,在第一次调试停止(它没有结束)之后,表单弹出但没有任何反应。
我唯一能猜到的是,控制器线程失去了优先级,再也没有获得 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);
}
我在控制器(线程)对象中插入了 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);
}
我不知道为什么,但是 update() 方法永远不会被调用,而是被无限次调用。为什么?