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