欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

在qt中怎么让主界面实时响应子线程发来的数据

更新时间: 2014-01-05 02:44:09 责任编辑: Author_N1

 

在Qt中如何让主界面实时响应子线程发来的数据
我在设计一个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,线程就立刻退出循环

请问各位大侠有什么好办法,可以让主线程实时响应次线程发出来的数据吗?
--参考方法--
将线程来的数据放到一缓冲区中,启动一个定时器,定时器回调函数取缓冲区中数据定时刷新界面
--参考方法--
我用这种方法弄过好几个项目了。没有什么问题啊?你再贴贴源代码,我帮你看看。
--参考方法--
我觉得你只要在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];

--参考方法--
"主线程拿到控制权后"是什么意思?
估计你的界面有做比较耗时的工作吧,才会不能及时响应消息,这种耗时的工作应该放在单独的线程中做。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:44:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/13730/
本文WWW.DOC100.NET DOC100.NET版权所有。