在Qt中如何让主界面实时响应子线程发来的数据

killer1978 2013-11-07 07:43:13
我在设计一个Ftp客户端,开了一个线程,在run函数里面创建QFtp对象,大概是这个样子
MyThread::run()
{
QFtp ftp = new QFtp();
setupConnect();----------------->这个函数用来建立ftp和主界面的连接
while(isRuning==true)
{
app.ProcessEvents();
this->usleep(100);
}
}

我发现这种做法响应很慢,比如当Ftp收到数据时会调用emit slot_updateToGUI("数据内容")发信号给界面,
通知界面打印数据,实际上界面不会立刻收到这个信号,而是等主线程拿到控制权后才刷新界面,这样一来界面就不能实时反映Ftp收到的数据了,而是等到主线程拿到控制权后,一次性打印出一大堆buffer着的数据。

关于在线程中那个while(isRuning==true),我觉得也不是很好,毕竟隔不到100毫秒就判断一次,非常浪费cpu的资源,但是不判断又不行,要即时响应退出的信号,就是说我在其他地方将isRuning=false,线程就立刻退出循环

请问各位大侠有什么好办法,可以让主线程实时响应次线程发出来的数据吗?
...全文
1629 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
killer1978 2013-11-13
  • 打赏
  • 举报
回复
后来发现是我往刷新一个文本框时每次写入的文字太多了,我原来用settext函数,后来发现还是用appand经济些,原来的做法消耗了大量的CPU...
  • 打赏
  • 举报
回复
"主线程拿到控制权后"是什么意思? 估计你的界面有做比较耗时的工作吧,才会不能及时响应消息,这种耗时的工作应该放在单独的线程中做。
killer1978 2013-11-08
  • 打赏
  • 举报
回复
可能问题出在QFtp上,QFtp是异步的,但是我需要它做到同步。 比如说 ftp->list();--->这个函数是异步的,也就是直接返回,但是我需要程序等待它拿完结果才返回、 如果我在下面加了个等待的函数 while(waitfinished==false)-->当ftp触发command finished信号时可以跳出while循环,但是这种等待的办法会不会让cpu很忙同时又造成主线程拿不到控制权去打印list拿到的数据呢? { myAutoFtpHandler.m_pApp->processEvents(); _sleep(50); }
killer1978 2013-11-08
  • 打赏
  • 举报
回复
但是我还是不能理解为什么次线程在工作的时候,主线程很久都轮不到CPU控制权,虽然我在次线程里有个浪费CPU时间的循环,但是按理讲,主线程应该在合理的时间获得CPU控制权,而不是在次线程给主线程发信号很久后才响应。多线程本来就是分享CPU时间片的技术,如果某个次线程把CPU的时间霸占得太久,那允许在主线程中的界面就像死了一样
killer1978 2013-11-08
  • 打赏
  • 举报
回复
引用 7 楼 IBM123 的回复:
1、建议不需要用thread. 2、等待用:QEventLoop; QFtp的commandFinished让QEventLoop退出.
您能解释一下QEventLoop的工作原理吗?跟m_pApp->processEvents();比较有何不同
ibm123 2013-11-08
  • 打赏
  • 举报
回复
1、建议不需要用thread.
2、等待用:QEventLoop; QFtp的commandFinished让QEventLoop退出.
RabinSong 2013-11-07
  • 打赏
  • 举报
回复
我觉得你只要在ftp接收中发送信号,没必要开个线程, QFtp ftp = new QFtp(); 放到界面窗口中,就可以了,感觉你的线程run就是来浪费cpu时间,没有做事情。 class CGui : public QWidget { Q_OBJECT public: CGui(QWidget *parent = NULL) : QWidget(parent) { QFtp ftp = new QFtp(); connect(ftp, SIGNAL(....), this, SLOT(rxFtpData())); } private slots: void rxFtpData() { buf[] = ...;//将接收到的数据放到缓冲区 //这里通知界面刷新,比如把他显示到QlineEdit中等,看你的应用了 } private: quint8 buf[MAX_SIZE]; }
dext 2013-11-07
  • 打赏
  • 举报
回复
我用这种方法弄过好几个项目了。没有什么问题啊?你再贴贴源代码,我帮你看看。
killer1978 2013-11-07
  • 打赏
  • 举报
回复
我是想问,对于Qt来说到底有没有官方的标准做法,可以次线程和主线程之间的交互更顺畅一些,次线程一发信号,主线程就马上反应
RabinSong 2013-11-07
  • 打赏
  • 举报
回复
将线程来的数据放到一缓冲区中,启动一个定时器,定时器回调函数取缓冲区中数据定时刷新界面

16,816

社区成员

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

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