我創建了兩個線程,並使用互斥鎖來同步它們。
在主窗口程序(我認爲是主線程)中創建另一個線程,我必須在至少兩個函數中使用互斥鎖,因爲當用戶選擇一個接口時,菜單並且配置數據,並且還有一個計時器每秒運行1次並且觸發一個插槽功能,其中讀取數據。使用互斥量後程序仍然崩潰(我可以在同一線程中使用互斥量嗎?)
我的程序經常甚至我使用互斥鎖。在「主線程」中有不同的功能,它們具有互斥鎖的鎖定和解鎖操作,其中一個功能是鏈接到定時器的插槽。另外另一個線程連續寫入數據。
我很困惑,爲什麼?
(:)我真的需要一個更好的手機這時候:)之前編輯我的問題)
我的代碼:
在螺紋:
class Background : public QThread
{
Q_OBJECT
public:
void Background::run(void)
{
initFile();
while(1)
{
Mutex->lock();
msleep(40);
rcv(); //writes map here
Mutex->unlock();
}
}
...
}
在線程的RCV():
void Background::rcv()
{
DEVMAP::iterator dev_r;
for(dev_r= DevMap.begin(); dev_r!= DevMap.end(); dev_r++)//DevMap is a refrence to the dev_map in mainwindow.
{
... ....//writes the map
}
}
在主窗口:
void MainWindow::initTimer()
{
refreshTimer = new QTimer(this);
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshLogDisplay()));
refreshTimer->start(1000);
}
void MainWindow::refreshLogDisplay()
{
//MUTEX
mutex->lock();
......//read the map
//MUTEX
mutex->unlock();
}
在線程的建設:
Background(DEVMap& map,...,QMutex* mutex):DevMap(map)...,Mutex(mutex){}
在主窗口它創建線程:
void MainWindow::initThread()
{
mutex = new QMutex;
back = new Background(dev_map,..., mutex);
back->start();
}
和:
void MainWindow::on_Create_triggered()//this function is a slot triggered by a menu item in the MainWindow UI
{
......//get information from a dialog
//MUTEX
mutex->lock();
BitState* bitState = new BitState(string((const char *)dlg->getName().toLocal8Bit()),
string((const char *)dlg->getNO().toLocal8Bit()),
dlg->getRevPortNo().toInt(), dlg->getSndPortNo().toInt());
dev_map.insert(DEVMAP::value_type (string((const char *)dlg->getPIN().toLocal8Bit()), *bitState));
//writes map here
//MUTEX
mutex->unlock();
}
請花時間好好寫。你不會喜歡這種風格的明顯衝突和寫作的答案,所以在提問時表現出相同的禮貌。 – Jon
謝謝,我編輯了它。 – Al2O3