找回密码
 立即注册
收起左侧

Qt QEventLoop::exec()

16
回复
6156
查看
[复制链接]
累计签到:75 天
连续签到:1 天
来源: 2020-4-29 18:07:23 显示全部楼层 |阅读模式
1Qter豆
各位大佬,Qt QEventLoop::exec()如何获取线程退出的返回值呢?有没有demo可以讲一讲?

回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-4 08:47:33 显示全部楼层
QEventLoop::exec() 这个跟线程有啥关系 ?这个不是事件循环嘛,还是我没明白你说的啥、
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-6 10:14:23 显示全部楼层
Since 发表于 2020-5-4 08:47
QEventLoop::exec() 这个跟线程有啥关系 ?这个不是事件循环嘛,还是我没明白你说的啥、 ...

我就是在事件循环里创建了一个线程,想知道这个线程什么时候结束,以及这个线程运行后是否有返回值,所以想问问,这个线程运行后是否成功或失败,那个返回值怎么获取出来?
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-7 08:17:56 显示全部楼层
线程的状态你是可以查询到的,如果你要从线程获取一定的数据,可以使用数据共享或者直接通过信号与曹,把要的数据传递给主线程
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-7 08:38:50 显示全部楼层
Since 发表于 2020-5-7 08:17
线程的状态你是可以查询到的,如果你要从线程获取一定的数据,可以使用数据共享或者直接通过信号与曹,把要 ...

状态是可以查询到,但是Qt里怎么获取一个线程的运行后的结果值,类似于MFC里调用CreateThread函数后,可以获取一个返回值一般,通过判断该返回值,来断定线程是否执行成功或失败

点评

是要查询线程是否是异常结束嘛?线程关闭是没有返回值的,  详情 回复 发表于 2020-5-7 14:03
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-7 14:03:29 显示全部楼层
lwei2 发表于 2020-5-7 08:38
状态是可以查询到,但是Qt里怎么获取一个线程的运行后的结果值,类似于MFC里调用CreateThread函数后,可 ...

是要查询线程是否是异常结束嘛?线程关闭是没有返回值的,
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-7 19:58:24 显示全部楼层
Since 发表于 2020-5-7 14:03
是要查询线程是否是异常结束嘛?线程关闭是没有返回值的,

哦哦,我现在有个程序,如下
    for(int i = 0; i < 3; i++)
{
    //线程A
   //线程B
  //线程C
}
如果不知道线程A运行结果是否有异常,怎么顺序执行B、C?
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-7 19:59:52 显示全部楼层
Since 发表于 2020-5-7 14:03
是要查询线程是否是异常结束嘛?线程关闭是没有返回值的,

虽然有finished信号判断线程状态,但是,好像这个判断后,线程仍然在运行,如果是多个线程,要怎么循环顺序调用呢?

点评

线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线程池的效果嘛 ?感觉有点乱呢~  详情 回复 发表于 2020-5-8 09:09
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-8 09:09:57 显示全部楼层
lwei2 发表于 2020-5-7 19:59
虽然有finished信号判断线程状态,但是,好像这个判断后,线程仍然在运行,如果是多个线程,要怎么循环顺 ...

线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线程池的效果嘛 ?感觉有点乱呢~
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-8 09:30:34 显示全部楼层
Since 发表于 2020-5-8 09:09
线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线 ...

就是说如果循环两次,线程A执行完,然后再执行线程B,最后执行线程C。以此类推,执行两次
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-8 09:31:48 显示全部楼层
Since 发表于 2020-5-8 09:09
线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线 ...

我知道线程ABC他们运行互不影响,但是我不希望运行A还没结束,就去运行B或C了。这样就得不到期望的结果了。

点评

可以用信号和槽来完成这个逻辑,A关闭之前发送信号到槽函数,槽函数打开B ,B 关闭的信号打开 C ,这应该是行得通 ~  详情 回复 发表于 2020-5-9 08:38
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-9 08:38:14 显示全部楼层
lwei2 发表于 2020-5-8 09:31
我知道线程ABC他们运行互不影响,但是我不希望运行A还没结束,就去运行B或C了。这样就得不到期望的结果了 ...

可以用信号和槽来完成这个逻辑,A关闭之前发送信号到槽函数,槽函数打开B ,B 关闭的信号打开 C ,这应该是行得通 ~
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-9 08:58:22 显示全部楼层
Since 发表于 2020-5-9 08:38
可以用信号和槽来完成这个逻辑,A关闭之前发送信号到槽函数,槽函数打开B ,B 关闭的信号打开 C ,这应该 ...

我也是按照这个逻辑来写的,如果把线程ABC看成一个事件,不循环,只要他们顺序执行,那就可以获得预期的结果。一旦进入循环后,这个线程A,在即将结束发finished信号给主线程,然后主线程调用线程B和C。在这个阶段,线程ABC会跳过前面n-2次循环,只运行最后一次循环。
例如
    for(int i = 0; i < 3; i++)
{
    //线程A
            threadA.start();
   //线程B
                   threadB.start();
  //线程C
                  threadC.start();
}

i = 0, 线程A、B、C第一次start(),但没有进入run()
i = 1, 线程A、B、C第二次start(),但没有进入run()
i = 2, 线程A、B、C第三次start(),但进入run()。
我预期是想通过循环把这个事件从线程A到C依次执行的,结果,它前两次都没有执行,直接跳过,只允许了最后一次。这个要怎么解决才能实现整个事件循环呢?除了每个线程都wait()阻塞外,有什么方法可以令它不阻塞。因为这个是一个槽函数,在主线程上调用。用wait()会引起界面卡顿的现象。

点评

线程 start 只能执行一次的,这个循环没有意义,  详情 回复 发表于 2020-5-11 08:24
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-11 08:24:05 显示全部楼层
lwei2 发表于 2020-5-9 08:58
我也是按照这个逻辑来写的,如果把线程ABC看成一个事件,不循环,只要他们顺序执行,那就可以获得预期的 ...

线程 start 只能执行一次的,这个循环没有意义,
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-11 10:22:06 显示全部楼层
Since 发表于 2020-5-11 08:24
线程 start 只能执行一次的,这个循环没有意义,

谢谢,这个后面弄明白了。现在有个问题:请问如何把子线程的子线程的数据同步更新显示到主线程GUI上呢?

点评

信号与槽是可以完成的,不过建议你多看一下,线程、进程间通信,包括共享数据、管道、数据库等等,方法还是很多的~  详情 回复 发表于 2020-5-12 08:24
回复

使用道具 举报

累计签到:742 天
连续签到:1 天
2020-5-12 08:24:28 显示全部楼层
lwei2 发表于 2020-5-11 10:22
谢谢,这个后面弄明白了。现在有个问题:请问如何把子线程的子线程的数据同步更新显示到主线程GUI上呢? ...

信号与槽是可以完成的,不过建议你多看一下,线程、进程间通信,包括共享数据、管道、数据库等等,方法还是很多的~
回复

使用道具 举报

累计签到:75 天
连续签到:1 天
2020-5-12 12:06:47 显示全部楼层
Since 发表于 2020-5-12 08:24
信号与槽是可以完成的,不过建议你多看一下,线程、进程间通信,包括共享数据、管道、数据库等等,方法还 ...

哎,我看了,但是好像还是没有解决……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了