1, 当界面的操作频率很高,而且还要考虑用户体验时,耗时的操作会独占系统cpu资源 ,让界面卡死在那里,这时需要考虑多线程方案,将耗时的操作放在
线程中执行
如下例,界面需要不停地添加字符串,如果不使用线程处理的话界面会卡死,下面我们先使用UC中的线程方法实现
void * processData(void *par){
/*使用线程访问界面*/
QTextBrowser *res=(QTextBrowser*)par;
sleep(2);
res->append("send data to server");
sleep(5);
res->append("client stop");
return par;
}
void DmsClient::startAndStop(){
/*把耗时操作 放入线程中 考虑线程如何访问
界面*/
res->append("client start");
pthread_t thid;
pthread_create(&thid,0,processData,res);
}
uc中的线程也可以实现其功能 但是与界面的耦合度比较高 要和界面通信必须传一个界面的对象到线程处理函数中去 看qt中的线程
qt中的线程是面向对象的 qthread类
界面中的代码示例如下
构造函数中
myth=new MyThread();
/*关联线程的信号和界面的槽*/
connect(myth,SIGNAL(mysig(QString)),this,SLOT(getData(QString)));
void Client::startAndStop(){
/*把耗时操作 放入线程中 考虑线程如何访问
界面*/
res->append("client start");
/*如何启动线程*/
myth->start();
start->setDisabled(true);
}
void Client::getData(QString data){
/*槽函数将数据接收到之后 显示到界面上*/
res->append(data);
}
线程类中 实现重写虚函数run函数
头文件:
class MyThread:public QThread{
Q_OBJECT
/*在run函数实现线程代码 完成数据的发送
让界面得知发送的数据 需要定义信号函数 */
public:
void run();
public:signals:
void mysig(QString par);
};
void MyThread::run(){
emit mysig("thread start");
/*循环发送数据*/
...........................
把数据通过信号发送出去
emit mysig(QString(datastr));
}
emit mysig("thread end!");
}