Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 信号/插槽多线程_C++_Multithreading_Qt_Signals Slots - Fatal编程技术网

C++ 信号/插槽多线程

C++ 信号/插槽多线程,c++,multithreading,qt,signals-slots,C++,Multithreading,Qt,Signals Slots,我知道这是关于线程间连接信号/插槽机制的下一个问题。我写了一份工作申请书 主要问题 我有一个已移动到另一个线程的工人类。应用程序的第二部分是带有按钮的GUI界面。当我单击按钮时,线程开始: void MainWindow::startStopThreadA() { ... else { threadA = new QThread; workerA = new WorkerObject; workerA->setMess

我知道这是关于线程间连接信号/插槽机制的下一个问题。我写了一份工作申请书

主要问题

我有一个已移动到另一个线程的工人类。应用程序的第二部分是带有按钮的GUI界面。当我单击按钮时,线程开始:

void MainWindow::startStopThreadA()
{
    ...
    else
    {
        threadA = new QThread;
        workerA = new WorkerObject;
        workerA->setMessage("Thread A running");
        workerA->moveToThread(threadA);

        connect(threadA, SIGNAL(started()), workerA, SLOT(process()), Qt::QueuedConnection);
        connect(workerA, SIGNAL(finished()), threadA, SLOT(quit()));
        connect(workerA, SIGNAL(finished()), workerA, SLOT(deleteLater()));
        connect(threadA, SIGNAL(finished()), threadA, SLOT(deleteLater()));
        //Connect signal from thread with slot from MainWindow
        connect(workerA, SIGNAL(printMessage(QString)), this, SLOT(printMessage(QString)), Qt::QueuedConnection);

        threadA->start();
        ui->threadAButton->setText("Stop A");
    }
}
线程启动时,会发出以下信号:

void WorkerObject::process(void)
{
    //Infinity thread loop
    forever
    {
        //Exit loop part
        mutex.lock();
        if(m_stop)
        {
            m_stop = false;
            mutex.unlock();
            break;
        }
        mutex.unlock();

        //Hold/unhold loop part
        mutex.lock();
        if(!m_hold)
        {
            mutex.unlock();
            //Here signal is emited
            emit printMessage(messageStr);          //That not works
            //qDebug() << "Thread A test message."; //That works properly
        }
        mutex.unlock();
    }
    emit finished();
}
这是我问题中最重要的部分:

当来自
workerA
对象的信号
printMessage
与GUI插槽
printMessage
通过
Qt::QueuedConnection
连接时,我的应用程序挂起。无法单击某个按钮,甚至无法退出应用程序

当信号/插槽与Qt::BlockingQueuedConnection连接时,一切正常。消息在线程之间发出和接收,GUI计时器也可以正常工作


所以我的问题是为什么连接
Qt::QueuedConnection
会导致应用程序冻结?

我通过@m7913d帮助解决了这个问题

您可以尝试在永久循环(f.e。 1秒钟)检查它是否解决了您的问题


所以工作线程太频繁地发出信号。在发出信号后添加
QThread::msleep(5)
确实有帮助。还需要包括在内。

我通过@m7913d帮助解决了这个问题

您可以尝试在永久循环(f.e。 1秒钟)检查它是否解决了您的问题


所以工作线程太频繁地发出信号。在发出信号后添加
QThread::msleep(5)
确实有帮助。也需要包括在内。

这很奇怪,通常它应该可以工作。您能否使用调试器中断/暂停程序,并检查主/GUI线程正在做什么?您可以尝试在永久循环中执行
QThread::sleep
(f.e.1秒),以检查它是否解决了您的问题。@m7913d,是的,这确实帮助了我。例如,我使用了
QThread::msleep(2)
,现在它真的可以工作了。Maby信号发出得太频繁了@G.M.,在
worker
中定义为
QString messageStr
,并在worker的ctor中赋值。在主GUI中,仅从发出的信号读取。这是否解决了您的问题?如果是这样,你可以考虑自己写一个答案。如果没有,请进一步澄清。这是奇怪的,通常它应该工作。您能否使用调试器中断/暂停程序,并检查主/GUI线程正在做什么?您可以尝试在永久循环中执行
QThread::sleep
(f.e.1秒),以检查它是否解决了您的问题。@m7913d,是的,这确实帮助了我。例如,我使用了
QThread::msleep(2)
,现在它真的可以工作了。Maby信号发出得太频繁了@G.M.,在
worker
中定义为
QString messageStr
,并在worker的ctor中赋值。在主GUI中,仅从发出的信号读取。这是否解决了您的问题?如果是这样,你可以考虑自己写一个答案。如果没有,请进一步澄清。
void MainWindow::printMessage(QString str)
{
    ui->textEdit->append(str);
}