QThread 卡在秒 运行

QThread stuck in second run

我的嵌入式设备上有一个 QThread。每次我 运行 应用程序时,我的线程都会在第二 运行 之后卡住。我试图在第一个 运行 之后终止我的线程。第二次 运行 后设备仍然卡住。我无法正确 运行 我的线程。

这是我的代码;

void ThreadCurrency::run()
{
    QMutex mutex;
    mutex.lock();
    if(this->CurrencyStop == true)
    {
         mutex.unlock();
        return;
    }

    QByteArray strdata;

    // Create QProcess object
    processCurrency = new QProcess();
    processCurrency->start("curl --insecure -v --cacert /data/ca/cert.pem https://secure.*******************/fx.jsp");

    if (processCurrency->waitForStarted(-1))
    {
        while(processCurrency->waitForReadyRead(-1))
        {
            strdata += processCurrency->readAllStandardOutput();
        }

        QMessageBox msgBox1;
        msgBox1.setWindowTitle("eCode Read");
        msgBox1.setText(strdata);
        msgBox1.exec();
    }
    else
    {
        while(processCurrency->waitForReadyRead(-1))
        {
            strdata += processCurrency->readAllStandardError();
        }

        QMessageBox msgBox1;
        msgBox1.setWindowTitle("eCode Error");
        msgBox1.setText(strdata);
        msgBox1.exec();

    }

    mutex.unlock();
    sleep(1);
    //*****************************************************************
    emit CurrencyChanged(aGBP, aEUR, aUSD, sGBP, sEUR, sUSD);
}

** 输出以 json 格式显示:**

{
 "date": "20171107", "currency": {
    "dolar": {
        "buy": "3,8200",
        "sale": "3,9050",
        "e_sale": "3,8200"
    },

  }
}

感谢您的建议。 QMutexLocker 无法在我的嵌入式设备中工作。 QMutex 和 QThread 是我可以在我的设备中获得的关闭。 我的问题是下面一行: emit CurrencyChanged(aGBP, aEUR, aUSD, sGBP, sEUR, sUSD);该行 运行s 但它不会触发 onCurrencyChanged SLOT。 onCurrencyChanged 中的任何内容都不会 运行。我的主线程代码是:

currencyThread = new ThreadCurrency (this);
connect(currencyThread,SIGNAL(CurrencyChanged(QString, QString, QString, QString, QString, QString)), this, SLOT(onCurrencyChanged (QString, QString, QString, QString, QString, QString)));
currencyThread->CurrencyStop = false;

currencyTimer = new QTimer(this);
connect(currencyTimer, SIGNAL(timeout()),this, SLOT(showCurrencyStatus()));
currencyTimer->start(30000); 


void MainWindow::onCurrencyChanged(QString aGBP, QString aEUR, QString aUSD, QString sGBP, QString sEUR, QString sUSD)
{
    // SHOW Currency
    ui->lblALIS_STG->setText(aGBP);
    ui->lblALIS_EUR->setText(aEUR);
    ui->lblALIS_USD->setText(aUSD);
    QCoreApplication::processEvents();

}

1) 不允许在主线程之外的线程中访问Widget。 因此将所有 QMessageBox 代码移动到主线程(例如在收到 CurrencyChanged 信号后)。

2) 确保 CurrencyChanged 信号使用 QueuedConnection 连接,否则,您的 GUI 将在辅助工作线程内执行。

3) 不要直接使用QMutex,使用QMutexLocker代替

4) 无论如何你为什么需要 Mutex?基于(任意)输入的锁定因此任意时间接近死锁您的应用程序。