qt 如何在一个函数中emit一个信号 然后再别的函数执行

liyingju001 2014-05-26 04:38:21
简单说下项目,发出采集命令后会接收到返回的数据,解析后将直接发出采集下一个传感器的命令,所有的传感器编号存在vector,但是有一个问题就是万一某一个传感器坏了,没有返回数据,那么包括这个传感器在内的传感器将不会再有数据写入,其实之后的传感器是能工作的,因此想修改下结构。发出采集命令后能发射一个信号开始计时,超过十秒没回来数据就采集下下条。这个代码怎么写啊??好吧,直接问代码怎么写,确实有点俗。但是十秒之内回来数据,正常工作。

void QTcpSocketThread::sendQueryValueCmd()//10 tongyong
{
if(qureyReady)
{
QSensor* sensor = sensorsVector.at( currentQueryIndx );
sensor->queryValueCmd(cmdBuffer);
tcpSocket->write( cmdBuffer );
qDebug()<<"sendQuerycmd10:"<<cmdBuffer.toHex()<<endl;
}
/**timer=new QTimer();
timer->setInterval(1000*3);
timer->moveToThread(this);
connect(timer,SIGNAL(timeout()),this,SLOT(sendQueryNextSensorValueCmd()),Qt::DirectConnection);
timer->start();**/ 已经证实这么写是错误的,行不通
//我想在此emit一个信号,connect某个函数,激活计时器,开始计时,之后的我会写,这个connect写在哪?又怎么关联起来
}
...全文
1324 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeequenLiu 2014-05-27
  • 打赏
  • 举报
回复
什么run? 我是看你在信号发送上没有解决,才想让你避开你的信号发送想法,先解决问题,我们的方式肯定是不一样的,你是10s后才能处理下一条。 如果你非要用信号的话,建议你先把什么数据接收,发送注释 ,只考虑信号 发送,看看是否成功。
liyingju001 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 killerls 的回复:
同意楼上的,你的不管用的方法,是因为qtimer需要qt的事件循环驱动,而当时你的函数正在占用qt的事件循环,需要你的执行函数退出后Qtimer才好用。不过你得函数一直不退出,所以估计不仅是timer不好用,整个软件都会不响应。另一个解决方案是用线程。如果资源允许的话,一个传感器一个线程--比较粗犷的玩法。
恩,前后你说的对着呢,确实是这样,后面线程这个搞不来,不会
liyingju001 2014-05-27
  • 打赏
  • 举报
回复
引用 1 楼 hackenliu 的回复:
其实你把问题复杂化了。 不建议你这么种,如果在5s时数据返回,你也要它等10s再执行下一个指令。 你应该是先判断是否有数据,如果有的话,正常执行下一条。 如果没有时,执行记录开始时间,用while 每隔1s(自定义)去检查一下数据是否返回,如果返回则正常下一条。 一直到当前时间减去开始时间 大于10 s时,还没有数据,则执行下一条。
我把你的想法看了很多遍,我觉得咱们说的差不多,我是发出命令后一直监听是否有数据到达,基本一样,我现在不知道怎么利用数据收到,我在run()中
connect( tcpSocket,
             SIGNAL( readyRead() ),
             this,
             SLOT( socketRead() ),
             Qt::DirectConnection );
然后再socketRead()中
recvPkgBuffer = tcpSocket->readAll();
,然后解析数据,然后currentQueryIndx加1,currentQueryIndx是存在vector中
killerls 2014-05-27
  • 打赏
  • 举报
回复
同意楼上的,你的不管用的方法,是因为qtimer需要qt的事件循环驱动,而当时你的函数正在占用qt的事件循环,需要你的执行函数退出后Qtimer才好用。不过你得函数一直不退出,所以估计不仅是timer不好用,整个软件都会不响应。另一个解决方案是用线程。如果资源允许的话,一个传感器一个线程--比较粗犷的玩法。
KeequenLiu 2014-05-26
  • 打赏
  • 举报
回复
其实你把问题复杂化了。 不建议你这么种,如果在5s时数据返回,你也要它等10s再执行下一个指令。 你应该是先判断是否有数据,如果有的话,正常执行下一条。 如果没有时,执行记录开始时间,用while 每隔1s(自定义)去检查一下数据是否返回,如果返回则正常下一条。 一直到当前时间减去开始时间 大于10 s时,还没有数据,则执行下一条。

16,818

社区成员

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

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