このようにQThreadを実装しましたが、実行時にプログラムがクラッシュします。QThreadを使用する正しい方法ではないという
投稿を検索して見ました。
しかし、プログラムがクラッシュする理由は見つかりません。「on_Create_triggered()」をトリガーするだけで、ミューテックスが適切にロックおよびロック解除されることを保証します。
プログラムを2日間テストしましたが('std :: cerr << ...;'でのみテストすると結果が出力されます)、それでも理由が見つかりません。(合理的に聞こえません...) :) What I guess is that the thread may wait for the lock too long and cause program to crash.
私のコード:
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();
}
MainWindow :(MainWindowにはBackground*がプロパティとして戻っています)
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();
}