這是QThread的子類的run方法:Qt的線程和循環問題
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表單在開始時打開,我想在主應用程序線程中。
問題是,對debug * 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()方法永遠不會被調用,而不是被稱爲無限次數。爲什麼?
不,我不認爲這可能是問題。調試或添加一些調試日誌記錄來檢查是否達到睡眠子句。也許其他方法之一導致無限循環? –
「//應該以流逝的時間的形式顯示」 - 您確定沒有直接從線程訪問GUI,而是僅通過信號/插槽來訪問GUI? – borisbn
我強烈建議保持QThread和實現彼此分離,即不要繼承QThread(閱讀Zaiborg的鏈接)。如果你真的重新實現'QThread :: run()',你需要在'run()'方法的末尾調用'exec()',否則任何事件(包括信號)都不會被線程處理。 –