在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];
}
[解决办法]
"主线程拿到控制权后"是什么意思?
估计你的界面有做比较耗时的工作吧,才会不能及时响应消息,这种耗时的工作应该放在单独的线程中做。