在我的程序中,我打开一个窗口并运行一个大循环。我在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()
减慢执行时间有点太多..但也许这是不可避免的..
我想尝试它的信号和插槽s,但我似乎无法想象如何将推入的停止按钮与循环连接起来。或者,信号和插槽与否,也许有人有一个更好的方式来实现这一目标?
编辑
继此线程的建议,我现在有一个工人/线程场景。所以我有一个窗口的构造函数
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();
这似乎工作正常。但是我现在怎么能介绍QTimer
?
如果我的QTimer
连接线程的start()
功能
connect(timer, &QTimer::timeout, thread, &QThread::start);
或者,我应该螺纹连接到QTimer
的start()
功能?
connect(thread, SIGNAL(started()), timer, &QTimer::start());
或者既不... ...但是,那么,怎么样?
为什么不使用线程来完成繁重的工作? – OnWhenReady