emit( SIGNAL), 会出现多个对象同时收到 ??(包括已经收到过,但是没结束任务的对象),另外请教线程的业务对象应该如何正确deleteLater?!

baidu_28726667 2019-08-12 10:27:01

void MyTcpServer::ReceiveData()
{
/*收取报文后创建一个线程执行任务*/
QThread * pNewThread = new QThread(); //线程对象
TcpService * pNewService = new TcpService(); //逻辑处理对象

/*Tcp服务器连接 Tcp逻辑处理(通知需要处理)*/
connect(this,SIGNAL(ServiceStart(QByteArray,unsigned int)),pNewService,SLOT(ServiceStart(QByteArray,unsigned int)),Qt::QueuedConnection);

/*Tcp逻辑处理连接Tcp服务器 (通知处理完毕). */
connect(pNewService,SIGNAL(ServiceFinsh(QByteArray,unsigned int)),this,SLOT(ServiceFinsh(QByteArray,unsigned int)),Qt::QueuedConnection);

/*线程完结 释放业务逻辑对象,这两行是否有区别??*/
QObject::connect(pNewThread, &QThread::finished, pNewService, &QObject::deleteLater,Qt::QueuedConnection);
//QObject::connect(pNewThread, &QThread::finished, pNewService, SLOT(pNewService->deleteLater()),Qt::QueuedConnection);

/*线程完结 释放线程本身对象*/
QObject::connect(pNewThread, &QThread::finished, pNewThread, &QObject::deleteLater,Qt::QueuedConnection);
/*不调用没有发现影响??*/
// QObject::connect(pNewThread, &QThread::finished, pNewThread, &QThread::quit,Qt::QueuedConnection);
// QObject::connect(pNewThread, &QThread::finished, pNewThread, &QThread::exit,Qt::QueuedConnection);

/*移到多线程工作*/
pNewService->moveToThread(pNewThread);

/*开始*/
pNewThread->start();

/*Tcp服务器发送信号给Tcp逻辑处理*/
emit(ServiceStart(Fmt,Fmt.size()));
return;
}


1.调试代码后发现这里的 emit发送信号后, 能正确执行pNewService,SLOT(ServiceStart()) .

2.但是当这个pNewService还没结束的时候. 再次emit() 会执行了一个新的pNewService任务 ,此时旧的pNewService又再次触发SLOT(ServiceStart()).

3.如果前面的任务都未完成,这个时候发送第三次emit(), 又会创建一个新的,并触发前面那几个旧的。导致错误执行了多次槽函数
(目前解决方法是,pNewService有个bool成员变量,执行一次,SLOT(ServiceStart())后,变成false。防止2次执行,但是并不能阻止触发,SLOT(ServiceStart()))

4. 另外想问这两行代码效果是不是一样呢? 上面的会不会有可能导致其它线程提早退出(我测试了几次,似乎不会。但不肯定)
/*线程完结 释放业务逻辑对象,这两行是否有区别??*/
QObject::connect(pNewThread, &QThread::finished, pNewService, &QObject::deleteLater,Qt::QueuedConnection);
//QObject::connect(pNewThread, &QThread::finished, pNewService, SLOT(pNewService->deleteLater()),Qt::QueuedConnection);



5. 线程实际有必要调用 exit()或者quit吗() ?
	/*线程完结 释放线程本身对象*/
QObject::connect(pNewThread, &QThread::finished, pNewThread, &QObject::deleteLater,Qt::QueuedConnection);
/*不调用没有发现影响??*/
// QObject::connect(pNewThread, &QThread::finished, pNewThread, &QThread::quit,Qt::QueuedConnection);
...全文
225 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ch_jm0723 2019-08-13
  • 打赏
  • 举报
回复
感觉设计不对呢 既然是一个service对象 为什么会多次emit service start呢
走好每一步 2019-08-12
  • 打赏
  • 举报
回复
引用 2 楼 baidu_28726667 的回复:
[quote=引用 1 楼 走好每一步 的回复:] 楼主可以先去学下windows 程序设计知识,尤其是多线程,多线程同步这些。 1、多线程 2、临界区 3、信号量 4、event事件 5、win32回调过程 6、消息循环和消息队列 7、线程的安全退出
你说的这些东西我都看过用过了,是我理解不透彻转换不到QT上吗[/quote] 看过、用过并不代表已经理解了。 如果真正理解透彻,QT学个两周,就能明白你上面的问题。
baidu_28726667 2019-08-12
  • 打赏
  • 举报
回复
引用 1 楼 走好每一步 的回复:
楼主可以先去学下windows 程序设计知识,尤其是多线程,多线程同步这些。 1、多线程 2、临界区 3、信号量 4、event事件 5、win32回调过程 6、消息循环和消息队列 7、线程的安全退出
你说的这些东西我都看过用过了,是我理解不透彻转换不到QT上吗
走好每一步 2019-08-12
  • 打赏
  • 举报
回复
楼主可以先去学下windows 程序设计知识,尤其是多线程,多线程同步这些。 1、多线程 2、临界区 3、信号量 4、event事件 5、win32回调过程 6、消息循环和消息队列 7、线程的安全退出

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧