lwei2 发表于 2020-4-29 18:07:23

Qt QEventLoop::exec()

各位大佬,Qt QEventLoop::exec()如何获取线程退出的返回值呢?有没有demo可以讲一讲?

Since 发表于 2020-5-4 08:47:33

QEventLoop::exec() 这个跟线程有啥关系 ?这个不是事件循环嘛,还是我没明白你说的啥、

lwei2 发表于 2020-5-6 10:14:23

Since 发表于 2020-5-4 08:47
QEventLoop::exec() 这个跟线程有啥关系 ?这个不是事件循环嘛,还是我没明白你说的啥、 ...

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

Since 发表于 2020-5-7 08:17:56

线程的状态你是可以查询到的,如果你要从线程获取一定的数据,可以使用数据共享或者直接通过信号与曹,把要的数据传递给主线程

lwei2 发表于 2020-5-7 08:38:50

Since 发表于 2020-5-7 08:17
线程的状态你是可以查询到的,如果你要从线程获取一定的数据,可以使用数据共享或者直接通过信号与曹,把要 ...

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

Since 发表于 2020-5-7 14:03:29

lwei2 发表于 2020-5-7 08:38
状态是可以查询到,但是Qt里怎么获取一个线程的运行后的结果值,类似于MFC里调用CreateThread函数后,可 ...

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

lwei2 发表于 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?

lwei2 发表于 2020-5-7 19:59:52

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

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

Since 发表于 2020-5-8 09:09:57

lwei2 发表于 2020-5-7 19:59
虽然有finished信号判断线程状态,但是,好像这个判断后,线程仍然在运行,如果是多个线程,要怎么循环顺 ...

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

lwei2 发表于 2020-5-8 09:30:34

Since 发表于 2020-5-8 09:09
线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线 ...

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

lwei2 发表于 2020-5-8 09:31:48

Since 发表于 2020-5-8 09:09
线程 A B C 的运行是互不影响的,Qt 线程的关闭你可以去百度一下,有点东西的,线程循环调用是啥意思,线 ...

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

Since 发表于 2020-5-9 08:38:14

lwei2 发表于 2020-5-8 09:31
我知道线程ABC他们运行互不影响,但是我不希望运行A还没结束,就去运行B或C了。这样就得不到期望的结果了 ...

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

lwei2 发表于 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()会引起界面卡顿的现象。

Since 发表于 2020-5-11 08:24:05

lwei2 发表于 2020-5-9 08:58
我也是按照这个逻辑来写的,如果把线程ABC看成一个事件,不循环,只要他们顺序执行,那就可以获得预期的 ...

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

lwei2 发表于 2020-5-11 10:22:06

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

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

Since 发表于 2020-5-12 08:24:28

lwei2 发表于 2020-5-11 10:22
谢谢,这个后面弄明白了。现在有个问题:请问如何把子线程的子线程的数据同步更新显示到主线程GUI上呢? ...

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

lwei2 发表于 2020-5-12 12:06:47

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

{:3_50:}哎,我看了,但是好像还是没有解决……
页: [1]
查看完整版本: Qt QEventLoop::exec()