[英]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.