首页| 论坛| 消息

回复: 从UI线程给子线程发信号,为什么没有被执行槽函数?
#6 回 mu_de_yu 的帖子 [stlcours 09-30 15:48]
mu_de_yu:针对你的问题:
两个问题起始是一个问题:
信号槽响应也是正常的函数调用,遵循事件队列先后执行,你的子线程在删除文件(一直循环),信号发送和槽函数响应也是你子线程执行的,所以只会在你循环结束后才会调用
 (2016-09-30 09:39) 
你这个回答,也是直击要害。就是子线程在删除文件(一直循环)结束之前,是不会接收到信号的,我也是这样认为的。但即使循环结束以后,子线程就能收到信号吗?我下断点之后,没有发现程序跳到MyTool::ChangeVar()中来。也许是因为DeleteAllFiles就是run()的最后内容了,所以线程被销毁了,没来及执行MyTool::ChangeVar()槽函数。要不我在run()执行DeleteAllFiles()之后,再加上一个其它的费时操作,这样中间就有了空隙,看看能不能执行到这个ChangeVar()槽函数。
#7 回 stlcours 的帖子 [mu_de_yu 09-30 16:18]
stlcours:你这个回答很简洁有力。但我是把问题模型简化了的。MyTool类里,有一堆的相关函数需要调用。最好把这些功能都写在MyTool类里。如果实在没办法,也就只有把那部分代码单独拿出来放到run里了。 (2016-09-30 15:45) 
1.就删除个文件,执行一条命令就行,还有一堆相关操作?
难道你将进度条显示也放到MyTool类里?
(如果是,理论上是行不通的,UI控件类只能在GUI主线程跑)
2.你的运行环境是在WIN还是Linux下?
#8 回 mu_de_yu 的帖子 [stlcours 09-30 16:26]
mu_de_yu:1.就删除个文件,执行一条命令就行,还有一堆相关操作?
难道你将进度条显示也放到MyTool类里?
(如果是,理论上是行不通的,UI控件类只能在GUI主线程跑)
2.你的运行环境是在WIN还是Linux下? (2016-09-30 16:18) 
其实是删除网络上的文件,不是本地文件,第三方库要初始化+验证等等,所以要一堆相关操作。另外这个删除所有文件的操作,是有一些类都会使用的,所以放在MyTool里归类比较好。
我运行在WIN。但最终结果要发布到三个平台。
另外请回答一下我的另一个问题,就是何时执行MyTool::ChangeVar()的问题
#9 [dbzhang800 09-30 16:37]
要使得你的ChangeVar槽能执行
要么:connect 使用 Qt::DirectConnection
要么:run 内开启事件循环QThread::exec()
#10 回 stlcours 的帖子 [mu_de_yu 09-30 16:48]
stlcours:其实是删除网络上的文件,不是本地文件,第三方库要初始化+验证等等,所以要一堆相关操作。另外这个删除所有文件的操作,是有一些类都会使用的,所以放在MyTool里归类比较好。
我运行在WIN。但最终结果要发布到三个平台。
另外请回答一下我的另一个问题,就是何时执行MyTool::Ch .. (2016-09-30 16:26) 
哦,好吧,对于你这个问题,你可以试下用全局变量
1.将你那个Bool变量设成全局
2.在OnStop()里将Bool变量设成false(记得加锁)
3.在删除文件函数里,每次删一个文件前,先判断Bool变量的值,为true则删,反之则跳出循环
恩,我对网络编程这块不熟,此方法只做参考

<< 1 2 3 >> (2/3)

回复 发表
主题 版块