Qt中的多线程问题:“Q-Thread的继承方式使用、线程间的数据交换、监听线程状态等”

多线程的目的是为了加速运算,在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的特殊机制:

槽函数妙啊!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注


皖ICP备2021003932号
召唤伊斯特瓦尔