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?基于(任意)输入的锁定因此任意时间接近死锁您的应用程序。
我的嵌入式设备上有一个 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?基于(任意)输入的锁定因此任意时间接近死锁您的应用程序。