QThread를 이와 같이 구현하지만 실행시 프로그램이 중단됩니다.
글을 검색하고 이라고 말하는 게시물을 보았지만 QThread를 사용하는 올바른 방법이 아닙니다.
하지만 내 프로그램의 충돌에 대한 어떤 이유도 찾을 수 없으며, 내가하는 일은 'on_Create_triggered()'을 트리거하는 것일 뿐이며 뮤텍스가 잠겨 있고 제대로 잠겨 있는지 보장합니다.
2 일 동안 테스트했는데 (이유는 'std :: cerr < < ...;'결과 만 출력합니다), 여전히 이유를 찾을 수 없습니다. (MainWindow를 :QThread가 프로그램을 충돌합니까?
#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를 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을 : What I guess is that the thread may wait for the lock too long and cause program to crash.
는 :
내 코드 (안 ... 합리적인 소리) 배경으로 * 다시 속성으로)
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에서) 의심 스럽습니다. 아무 슬롯에도 연결하지 않아도 'timer = 새로운 QTimer() '와'timer-> start (1000) '는 프로그램을 중단 시키지만 모든 것이 주석으로 처리 된 것 같습니다. :) – Al2O3