私のプログラムでは、ウィンドウを開いて大きなループを実行します。で進行状況を表示しますQTextEdit
。大きなループを止めるキャンセルボタンを追加しました。
したがって、ウィンドウコンストラクターで、次のようなメソッドを実行します。
void start()
{
for (size_t i=0, i<10000000; ++i)
{
// do some computing
QApplication::processEvents(); // Else clicking the stop button has no effect until the end of the loop
if (m_stop) break; // member m_stop set to false at start.
}
}
したがって、停止ボタンをクリックすると、スロットが実行されます
void stopLoop()
{
m_stop = true;
}
その方法の問題はprocessEvents()
、実行時間が少し遅くなりすぎることです..しかし、おそらくそれは避けられない..
シグナルとスロットで試してみたかったのですが、押された停止ボタンをループに接続する方法が思いつかないようです。
または、信号とスロットかどうかにかかわらず、誰かがこれを達成するためのより良い方法を持っているのでしょうか?
編集
このスレッドのアドバイスに従って、ワーカー/スレッドのシナリオができました。だから私はウィンドウコンストラクターにいます
Worker *worker;
QThread *thread ;
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(work()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
これはうまくいくようです。しかし、どうすれば now を導入できQTimer
ますか?
QTimer
をスレッドのstart()
関数に接続する必要がありますか
connect(timer, &QTimer::timeout, thread, &QThread::start);
または、スレッドをQTimer
のstart()
関数に接続する必要がありますか?
connect(thread, SIGNAL(started()), timer, &QTimer::start());
またはどちらでもない...しかし、どうやって?