多线程的目的是为了加速运算,在Qt里面,继承于Q-Thread类的多线程调用方式是一种较好的操作,而且配合一些使用技巧,能够较好的发挥多线程优势
class thread_one : public QThread { Q_OBJECT public: private: signals: protected: }
针对上述结构,建议定义全局变量,或,使用“引用”方式进行线程间数据交换,注意,Qt线程一般不用于处理界面问题,线程的本质是加速数据处理速度,因此,线程应当是接收外部复杂运算数据输入,同时输出待获取量
而,一旦开启该线程,即运行以下代码:
protected: void run();
也就是说,请把数据处理操作放在run函数内部执行,否则线程无效,自然,我个人的喜好是通过拷贝待处理量进入线程继承类,这是第一步
public: //QString Temp_era; qreal y_replace[10];
简而言之,就是定义public变量,将待处理数据全部拷贝进入Thread类里面,然后,在run函数内部<我更喜欢再独立化函数处理>运行处理代码,获取输出
void thread_one::run() { __max__ = Com_Max(); __min__ = Com_Min(); //quit(); //wait(); //exit(); emit over(); }
注意,线程继承操作使用,需要初始化,同时,建议采用槽函数进行监听,即,signals内部的信号函数,在初始化时,进行connect
void MainWindow::threadInit() { new_thread_one = new thread_one(); if(QObject::connect(new_thread_one,SIGNAL(over()),this,SLOT(dealThreadOver()))) { ui->Debug_infor_->append("新线程1:关联成功!"); } else { ui->Debug_infor_->append("新线程1:关联失败!"); } }
目的是检测新线程处理完毕,进行后续操作,而且,我这里将后续部分放在响应函数内部执行,更加方便,由于是全局变量交换数据,因此只要执行了开始线程语句,并在响应函数内部处理输出数据,即可完成一次线程操作
new_thread_one->start();
void MainWindow::dealThreadOver() { //new_thread_one->over(); UI.yAxis->setRange(__min__,__max__); ui->serial_infor_->append("THREAD RUNNING OVER!\\."); }
槽函数算是比较靠谱的线程处理操作了,之前原本想绕过去,不过很明显不靠谱,而且数据处理层面有问题,现在还是老老实实用了,但是,使用之前,务必捋清楚逻辑,不然,很麻烦
再次强调:
多线程适用于处理数据<越复杂越可以开启多线程处理><理论上>,线程操作不适合界面,尤其是Qt界面方面的拓展操作,因为这也不是线程创立的目的
thread_one::thread_one(QObject *parent) : QThread(parent) { //do nothing //Temp_era = "23.6"; }
继承类初始化,不建议进行一些复杂操作灌入,有兴趣可以试试看比较复杂且耗时的处理,利用多线程,测一测是不是速度有提高🐸
再次膜拜一下Qt的特殊机制: