これは、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 フォームは開始時に開かれます。メイン アプリケーション スレッドにあると思います。
問題は、despise on debug *i=0 および seconds_total = X > 0 であり、ループが 1 回だけ実行され、最初にデバッグが停止した後 (終了しない)、フォームがポップアップしますが、何も起こりません。
私が推測できる唯一のことは、コントローラースレッドが優先順位を失い、二度とCPUを獲得できないことです。
どうすればこれを回避できますか?
EDIT 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() メソッドが無限に呼び出されるのではなく、まったく呼び出されません。なんで?