Qt中主线程与子线程之间操作的问题

Qt中主线程与子线程之间操作的问题

今天在工作的时候遇到一个Qt中关于多线程的问题,困扰了半天时间,在同事的帮助下解决了,因此来记录一下,以免下次在遇到时又一脸懵,也供像我一样的小白借鉴。好与不好请勿乱评,正在学习中的小白一枚。。

问题:
在主线程中创建工作线程(一个while循环测试)后,想单击暂停按钮进行暂停操作和继续按钮继续执行操作,建立信号与槽的关系,工作线程可以正常执行,但暂停按钮发送消息后,暂停槽一直没有执行,代码如下:
有三个类:用A(主),B(线程类),C(工作执行类)代替

A.cpp:
void A::on_StartButton_clicked()
{
//运行线程
m_pRunThread=new QThread;
runThread1 = new MyThread;
runThread1->moveToThread(m_pRunThread);
connect(m_pRunThread,SIGNAL(started()),runThread1,SLOT(mywork()));//工作线程
connect(this,SIGNAL(zt()),runThread1,SLOT(ZT()));//暂停线程
m_pRunThread->start();
}

B.cpp:
void B::mywork()
{
qDebug()<<“mywork id :”<<QThread::currentThreadId();
m_ProcManage.Test();
}

void B::ZT()
{
 	qDebug()<<"zanting id :"<<QThread::currentThreadId();
   	m_ProcManage.mutex.lock();
}

void B::JX()
{
	 m_ProcManage.mutex.unlock();
}

C.cpp:
int C::Test()
{
qDebug()<<“RNA id :”<<QThread::currentThreadId();
int i =0;
while(true)
{
mutex.lock();
qDebug()<<i++;
mutex.unlock();
QThread::msleep(500);
}
return 0;
}

A类中初始化B类对象,通过B执行C中的While(),A类中点击暂停发送消息执行B类中的ZT()槽。
经过排查发现当把While()代码屏蔽掉点击暂停发送消息可以执行B类中的ZT()槽,自己猜测可能是while()一直在循环没有退出,导致connect(this,SIGNAL(zt()),runThread1,SLOT(ZT()))在排队等待while()执行完。
解决的方法:
把 connect(this,SIGNAL(zt()),runThread1,SLOT(ZT()));修改为 connect(this,SIGNAL(zt()),runThread1,SLOT(ZT()),Qt::DirectConnection);
注意:Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。
建议:线程与线程之间进行操作通过信号与槽来实现方便简单,使用信号与槽的时候,要先建立连接,然后在emit。
总结:对于线程与线程之间的操作还不够熟悉,今后多学、多了解、多练关于线程方面的知识,学无止境,多多学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值