我這樣實現QThread,但運行時會導致程序崩潰。
我查過並看到帖子說這不是使用QThread的正確方法。
但我找不到任何我的程序崩潰的原因,我所做的只是 觸發'on_Create_triggered()',我保證互斥鎖被正確鎖定和解鎖。
我已經測試計劃兩天(只通過測試「的std :: CERR < < ...;」打印結果),但還是找不到原因。 What I guess is that the thread may wait for the lock too long and cause program to crash.
(不是聽起來很有道理...) :)QThread崩潰程序?
我的代碼:
Background.h
class Background : public QThread
{
Q_OBJECT
public:
Background(int& val,DEVMAP& map, QQueue<LogInfoItem*>& queue, QList<DEV*>& devlist, QList<IconLabel*>& icllist,QMutex& m)
:val_i(val),DevMap(map), LogInfoQueue(queue), DevInfoList(devlist), IconLabelList(icllist),mutex(m)
{}
~Background();
protected:
void run(void);
private:
DEVMAP& DevMap;
QQueue<LogInfoItem*>&LogInfoQueue;
QList<DEV*>& DevInfoList;
QList<IconLabel*>& IconLabelList;
int& val_i;
QMutex& mutex;
void rcv();
};
Background.cpp
#include "background.h"
Background::~Background()
{
LogFile->close();
}
void Background::run(void)
{
initFile();
while(1)
{
msleep(5);
rcv();
}
}
void Background::rcv()
{
mutex.lock();
...
...//access DevMap, LogInfoQueue, DevInfoList, IconLabelList and val_i;
...
mutex.unlock();
}
主窗口(主窗口有背景*作爲財產)
void MainWindow::initThread()
{
back = new Background(val_i, dev_map, logDisplayQueue, devInfoList, iconLabelList, mutex);
back->start();
}
void MainWindow::on_Create_triggered()
{
mutex.lock();
...
...//access DevMap, LogInfoQueue, DevInfoList, IconLabelList and val_i;
...
mutex.unlock();
}
在哪裏做你的調試器說,它已經崩潰? – cmannett85
任何地方,差不多。不一樣的地方。通常當線程等待鎖(我發現它不是通過調試器打印出來的)... :) – Al2O3
現在我真的懷疑我的程序中有一個QTimer(在MainWindow中)即使我沒有將它連接到任何SLOT,但'timer =新的QTimer()'和'timer-> start(1000)'會使程序崩潰,但是一切似乎都適用於兩個句子評論... :) – Al2O3