Qt线程里,emit 信号后,sleep(10)的问题

herostarone 2011-09-26 09:22:49
加精
过程:
首先 线程的信号 跟 主线程的槽 是异步连接的。
我在一个继承自 QThread的线程的run函数里,emit 信号后,立即sleep(10) 10秒。

结果:
emit后,槽并没有立即执行,而是等到sleep 10秒后,才会执行。

无论如何改变sleep的值,槽都要在sleep后才能执行。

问题:
所以想不通是为什么,明明是异步的,信号发出后,主线程空闲就可以处理就可以了,可是为何要偏偏等从线程的sleep结束后才能执行呢,往指教,谢谢
...全文
1606 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
reyoung1110 2011-10-03
  • 打赏
  • 举报
回复
QCoreApplication::processEvents

在Sleep之前,处理下事件队列中的事件就好了。
qingtianriji 2011-10-03
  • 打赏
  • 举报
回复
只是像拿个几分,谢谢
qingtianriji 2011-10-03
  • 打赏
  • 举报
回复
好东西啊,谢谢
qingtianriji 2011-10-03
  • 打赏
  • 举报
回复
这个确实不催
wjlsmail 2011-09-30
  • 打赏
  • 举报
回复
在楼主代码中没有看到一个 wait 啊
lyh7736362 2011-09-28
  • 打赏
  • 举报
回复
让Web应用程序飞起来的秘诀
herostarone 2011-09-28
  • 打赏
  • 举报
回复

是因为wait阻塞了主线程,所以 主线程的槽不可能执行的


[Quote=引用 21 楼 rsd102 的回复:]

引用 1 楼 ximidong 的回复:

信号要等这个函数执行完了才会发出的吧


我也有这个感觉
[/Quote]
程序员小哈 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ximidong 的回复:]

信号要等这个函数执行完了才会发出的吧
[/Quote]

我也有这个感觉
gwemail2003 2011-09-28
  • 打赏
  • 举报
回复
还是没搞懂,想知道结果。。。
zhan7505201 2011-09-28
  • 打赏
  • 举报
回复
学习。
dbzhang800 2011-09-27
  • 打赏
  • 举报
回复
哈哈,难怪,本来简单的一问题,越搅越乱。
百事烟 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dbzhang800 的回复:]
引用 9 楼 herostarone 的回复:
为何跟wait有关系啊,能讲讲吗,我自己做了个小实验,加上了wait,也没有问题啊,而且我如果不加wait,直接delete,那么万一前面的命令还没执行到,就delete了,怎么行啊

引用 7 楼 delphigis 的回复:

把wait去掉就可以了,想办法在其它地方delete线程,

另外建议你用postEvent,在线程中用c……
[/Quote]
我是lz马甲,看过代码了
dbzhang800 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 herostarone 的回复:]
为何跟wait有关系啊,能讲讲吗,我自己做了个小实验,加上了wait,也没有问题啊,而且我如果不加wait,直接delete,那么万一前面的命令还没执行到,就delete了,怎么行啊

引用 7 楼 delphigis 的回复:

把wait去掉就可以了,想办法在其它地方delete线程,

另外建议你用postEvent,在线程中用connect效果不好
[/Quote]
在你给出完整的例子之前,一般来说,别人给的任何关于具体代码的建议,你都可以直接忽略。

没看病就开药的大夫,开的药效果会怎么,大家应该清楚。(当然,有时确实可以治好病,)
百事烟 2011-09-27
  • 打赏
  • 举报
回复
delete线程前要先判断和结束线程,结束线程的方法有很多,根据实际情况

公共变量 wait信号
herostarone 2011-09-27
  • 打赏
  • 举报
回复
我应该理解你的意思了,你的意思是,我虽然emit了异步信号,但是主线程被wait阻塞猪了,所以不能执行。

其实我是emit给另外一个线程2,但是那个slot只是线程类的 一个成员函数,而主线程 创建了线程2,因为只有run里才算真正的线程,所以 可以说,线程2的slot就是主线程的,这样理解对吧,所以给你结果也挺吻合的。


[Quote=引用 7 楼 delphigis 的回复:]

把wait去掉就可以了,想办法在其它地方delete线程,

另外建议你用postEvent,在线程中用connect效果不好
[/Quote]
百事烟 2011-09-27
  • 打赏
  • 举报
回复
控制台和UI程序不一样

在UI程序下,你点一个按钮启动一个线程,在此按钮内不可以有wait,

控制台另外说.....
herostarone 2011-09-27
  • 打赏
  • 举报
回复

为何跟wait有关系啊,能讲讲吗,我自己做了个小实验,加上了wait,也没有问题啊,而且我如果不加wait,直接delete,那么万一前面的命令还没执行到,就delete了,怎么行啊

[Quote=引用 7 楼 delphigis 的回复:]

把wait去掉就可以了,想办法在其它地方delete线程,

另外建议你用postEvent,在线程中用connect效果不好
[/Quote]
herostarone 2011-09-27
  • 打赏
  • 举报
回复
我按你那个实验 又重新做了一遍,emit后确实就可以发射出去啦,但是我程序还是不行。
这个是 其对应的槽
void ParseThread::parseOneCommand(QByteArray commandInf,int signOfNormalOrOhers)
{
for(int fieldindex=0;fieldindex<MAX_FIELD_NUM;fieldindex++)
{
if(this->treatBufferArray[fieldindex].count()>0)
this->treatBufferArray[fieldindex].resize(0);
if(this->commandInfQueue[fieldindex].count()>0)
this->commandInfQueue[fieldindex].clear();
}

this->comSequence = commandInf;
QByteArray tmp;
QVector<QByteArray> dataArray;
int index;
dataArray.resize(0);

qDebug("sending %s the fist byte is 0x%x\n",comSequence.data(),comSequence.at(0));
。。。
}

就是红色的qdebug没打印出去,我再仔细看看,其他的原因,好像还真不好想呢



[Quote=引用 4 楼 dbzhang800 的回复:]

引用 3 楼 herostarone 的回复:
你好,这是我的代码,这个函数是执行在run中的,最后一个emit发射后,sleep了10秒,我在因为是再主线程先stop = true,然后warit,然后delete,所以要进析构函数,我再析构里也发射了一次相同的emit。

结果是while里最后一次emit的槽和 析构的emit 槽在sleep10秒后同时的执行了。

还是那句话,……
[/Quote]
百事烟 2011-09-27
  • 打赏
  • 举报
回复
把wait去掉就可以了,想办法在其它地方delete线程,

另外建议你用postEvent,在线程中用connect效果不好
project15 2011-09-27
  • 打赏
  • 举报
回复
sleep影响的是进程
加载更多回复(7)

16,211

社区成员

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

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