首页| 论坛| 消息

标题:qmqtt收不到信号?
作者:foxgod
日期:2019-05-24 08:43
内容:

使用qmqtt的过程里面本来一切都正常,原来代码是
connect(m_mqClient,SIGNAL(ReciverMessage(QByteArray)),this,SLOT(ReciverMsg(QByteArray)));
此信号为qmqtt收到一个消息就的信号
主界面
通过ReciverMsg(QByteArray)这个槽函数收到消息。然后处理。
但是因为在gui界面想一个个处理消息,不想收到消息就处理,也就是不想多线程处理,所以在ReciverMsg(QByteArray)槽函数里面把收到的消息保存起来,放一个队列里面,在gui界面里面有个死循环
while(true)
{
QByteArrayrebackdata;
if(!m_bIsBusy)
{
if(ww->ReadControlMessage(rebackdata))//保存在队列里面的一个函数,从这个函数里面一个个读取消息
{
m_bIsBusy = true;
WriteFile(rebackdata);
}
else
{
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);//处理其他消息、事件。
}
}
else
{
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);//处理其他消息、事件。
}
这样做后,信号和槽函数都没有办法 ..


#1 [20091001753 05-24 09:06]
你可以简单理解为 Qt 自带了一个循环,就是事件循环。

如果你再自创一个死循环,你就成功地把 Qt 的事件循环给锁死了。自然也就收不到信号。
#2 [angelus 05-24 09:24]
首先,界面gui事件循环就是程序的主循环,可以理解为主进程循环,如果在主进程循环中自己创建一个子循环,这样是不对了,因为会阻碍主循环运行,特别是用while这样的程序锁死循环,更是不可取,可以尝试下qt提供的QEventLoop,可以更优雅的在主循环中创建子循环,创建的子循环有参数可以选择,但是在一些平台下,是有限制的,如果仅仅是win下,没有任何问题的,QEventLoop的子循环可以全部阻塞事件,也可以只阻塞部分类型的事件,但是,像网络事件你这种要求一直阻塞去接收的建议开启线程去处理,不要阻塞主循环
#3 回 20091001753 的帖子 [foxgod 05-24 09:28]
20091001753:你可以简单理解为 Qt 自带了一个循环,就是事件循环。

如果你再自创一个死循环,你就成功地把 Qt 的事件循环给锁死了。自然也就收不到信号。

(2019-05-24 09:06)
那请教下,如果我想实现类似这样的功能怎么做呢,可以用定时器吗?
#4 回 angelus 的帖子 [foxgod 05-24 09:33]
angelus:首先,界面gui事件循环就是程序的主循环,可以理解为主进程循环,如果在主进程循环中自己创建一个子循环,这样是不对了,因为会阻碍主循环运行,特别是用while这样的程序锁死循环,更是不可取,可以尝试下qt提供的QEventLoop,可以更优雅的在主循环中创建子循环,创建的子循环有参 .. (2019-05-24 09:24) 
除了那个办法,还有别的办法没
#5 [20091001753 05-24 09:34]
就是用信号槽啊,自己定义信号与槽函数,你已经这么做了:
connect(m_mqClient,SIGNAL(ReciverMessage(QByteArray)),this,SLOT(ReciverMsg(QByteArray)))

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

回复 发表
主题 版块