簡體   English   中英

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是我可以在設備中獲得的關閉。 我的問題是以下行:發出CurrencyChanged(aGBP,aEUR,aUSD,sGBP,sEUR,sUSD); 該行運行,但是不會在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)除主線程外,不允許訪問其他線程中的小部件。 因此,將所有QMessageBox代碼移至主線程(例如,在收到CurrencyChanged信號之后)。

2)確保使用QueuedConnection連接了CurrencyChanged信號,否則,您的GUI將在輔助工作線程內執行。

3)不要直接使用QMutex ,請改用QMutexLocker

4)為什么您仍然需要互斥體? 基於(任意)輸入的鎖定因此任意時間都接近死鎖您的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM