在等待QThread /如何正确使用QThread时,UI会阻塞吗?

问题描述 投票:0回答:3

如果我在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;
        }

    }
c++ qt qthread
3个回答
1
投票

如果您不想阻止用户界面,您所要做的就是在while循环中调用QApplication::processEvents();

我有一些代码使用std :: future而不是QThread,我的代码如下所示:

while (!progressIndicator->UserBreak()
    && (future.wait_for(std::chrono::seconds(0)) != std::future_status::ready))
{
    QApplication::processEvents();
}

这很好用。


2
投票

QThread有一个finished信号。将此连接到某个适当的插槽,这将触发线程完成所需的任何操作。

我想最好的候选人知道进展到底有多远是工作者线程本身。您可以创建自己的信号,将当前进度发送到某个插槽,该插槽将适当地更新进度条。

或者,您可以使用QTimer不时读取当前进度(这类似于您现在所拥有的,但不会阻止UI)。


0
投票

要在操作运行时更新UI线程的进度条,请使用QTimer对象增加进度条的值(最大值将是:操作完成时比进度条的值小1)。还可以通过Signal / Slot方法将QThread连接到插槽,以在操作结束时发出UI线程的信号。当QThread完成操作时,将信号发送到UI线程中的Slot,这将设置进度条的最终值并停止QTimer。

© www.soinside.com 2019 - 2024. All rights reserved.