关于QT 多线程moveToThread的使用,实测过,用不起你找我

moveToThread使用与不同任务的使用,我主要用来使用读取mysql数据,这个动作会消耗很多时间,不使用多线程会造成卡顿。以下是CPP代码

mysql_thread::mysql_thread(QObject *parent) : QObject(parent)
{

}

mysql_thread::~mysql_thread()
{

}

void mysql_thread::task_01(void)
{
    int i=0;
    while(1)
    {
        if(thread_start == 1)  //标志位=1,循环执行耗时函数
        {
            emit task_01_signal(i++);
            QThread::msleep(500);
            qDebug("------------------%d",i);
        }
        else  //标志位=0,跳出循环,线程执行结束
        {
            break;
        }
    }
    emit Finshed();	//信号 线程执行完发送
}

以下是h文件代码

class mysql_thread : public QObject
{
    Q_OBJECT
public:
    explicit mysql_thread(QObject *parent = nullptr);
    ~mysql_thread();  //析构函数;
    void task_01(void);
    volatile bool thread_start=1;//线程标志位

signals:
    void Finshed();	//信号 线程执行完发送,这个可以不用
    void task_01_signal(int value);   
    void task_02_signal(int value);
};

然后就是最关键main文件代码

    mysql_thread_user = new mysql_thread;        // 
    my_thread1 = new QThread(this);              // 
    mysql_thread_user->moveToThread(my_thread1); // 
    //任务结束销毁线程很重要,不然主线程退出了,子线程还在跑
    connect(this, &QObject::destroyed, [=](){
        mysql_thread_user->thread_start = 0;   //
        my_thread1->exit();  //退出线程
        my_thread1->wait();  //并等待线程完成当前循环
        delete my_thread1;
    });  //线程销毁
    connect(ui->pushButton_4, &QPushButton::clicked, mysql_thread_user, &mysql_thread::task_01); // 采用按钮触发开启线程方式
//    QObject::connect(my_thread1, &QThread::started, mysql_thread_user, &mysql_thread::task_01); // 线程直接开起就执行任务;
    QObject::connect(mysql_thread_user,SIGNAL(task_01_signal(int)),this,SLOT(ReceiveTest(int)),Qt::QueuedConnection);  //子线程和主线程连接;
    my_thread1->start();    // 启动新线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值