如果我在ui线程(窗口)中有一个进度条,它将一直运行直到方法完成它的工作,如果我等待第二个QThread完成,ui线程是否会阻塞进度条?如果ui线程阻塞等待,那么我不会等待第二个线程。我想实现一个回调方法,它将在第二个线程完成时调用,但随后:我如何连接到回调方法?
我想做什么?我有一个窗口,这个窗口有一个首先看不到的进度条。当用户按下某个按钮来请求数据时,将调用一个方法,该方法返回一个RequestPointer,其中包含一个返回请求状态的方法。当用户按下按钮时,我想让进度条可见,无限运行直到请求完成,我可以将数据打印到窗口。对于Worker我想传递这个指针,工作者检查while(flag)循环,如果状态仍然在运行,如果是,则休眠。当工人完成时,我想停止进度条并再次使其不可见。我是否必须将进度条传递给线程,还是可以在不阻塞ui的情况下等待线程?
我不是一个Qt职业选手。真的很新。我试图从https://doc.qt.io/Qt-5/qthread.html网站获得一些信息,但是我对理解代码示例有点困难。
我的工人类中的方法:
void Worker::watchRequest(RequestPtr r_ptr)
{
bool exit = true;
while (!exit)
{
ErrorCode errorCode = r_ptr->Test();
switch (errorCode)
{
case Request_RUNNING:
QThread::msleep(10);
break;
case Request_ABORTED:
exit = true;
break;
case Request_SUCCESS:
exit = true;
break;
}
}
如果您不想阻止用户界面,您所要做的就是在while循环中调用QApplication::processEvents();
。
我有一些代码使用std :: future而不是QThread,我的代码如下所示:
while (!progressIndicator->UserBreak()
&& (future.wait_for(std::chrono::seconds(0)) != std::future_status::ready))
{
QApplication::processEvents();
}
这很好用。
要在操作运行时更新UI线程的进度条,请使用QTimer对象增加进度条的值(最大值将是:操作完成时比进度条的值小1)。还可以通过Signal / Slot方法将QThread连接到插槽,以在操作结束时发出UI线程的信号。当QThread完成操作时,将信号发送到UI线程中的Slot,这将设置进度条的最终值并停止QTimer。