简体   繁体   中英

multi-thread communicate in qt

Problem Description

fetchParam
QThread(0x1d23120) -index: 0
showAudioInfo
QThread(0x1d231c0) -index: 1
showAudioInfo

but now print:

fetchParam
QThread(0x1d23120) -index: 0
QThread(0x1d231c0) -index: 0
showAudioInfo
showAudioInfo
how to deal?

program:

//MyWidget class
int MyWidget::index = 0;
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    ui->le_ThreadNum->setText("2");
    //create thread 
    createThread(THREADNUM);

    connect(ui->pb_test, &QPushButton::clicked, this, &MyWidget::dealSignal);
}
void MyWidget::dealSignal()
{
    int num = ui->le_ThreadNum->text().toInt();
    int count = 0;
    if (num>THREADNUM)
    {
        count = num - THREADNUM;
        createThread(count);
    }

    //connect signal and slot 
    connect(this, &MyWidget::toWork, distinguishFileTaskList.at(0), &MyTask::dealToWork);
    connect(distinguishFileTaskList.at(0), &MyTask::toFetchParam, this, &MyWidget::fetchParam);
    for (int i = 0; i<num; i++)
    {
        connect(this, &MyWidget::toDistinguish, distinguishFileTaskList.at(i), &MyTask::dealDistinguishFile);
        connect(distinguishFileTaskList.at(i), &MyTask::toShowAudioInfo, this, &MyWidget::showAudioInfo);
    }
}
void MyWidget::fetchParam()
{
    qDebug() << "fetchParam";
    emit toDistinguish(index);
}
void MyWidget::showAudioInfo()
{
    qDebug() << "showAudioInfo";
    index++;
}

//MyTask class (thread invoke code)
void MyTask::dealDistinguishFile(int index)
{
    qDebug() << QThread::currentThread() << "-index:" << index;
    emit toShowAudioInfo(index);//send signal
}

void MyTask::dealToWork()
{
    emit toFetchParam();
}

Usually you can just define a custom Qt signal in your sender thread and connect it to some slot outsid eof the thread. Inter-thread communication is by default thread safe with Qt signals and slots (queued signals).

Signals and Slots Across Threads

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM