我正在使用QT來運行流量項目。 有一點,我創建了一個線程,他必須設置一些變量,等待某個時間,將變量設置爲另一個值並且死掉; 當此線程正在等待時,其他線程必須繼續運行。 這是線程類從QT中的另一個GUI線程調用線程時出現問題
//CLASS FOR CHANGING DYNAMIC LANE
class change_lane : public QThread
{
private:
lane* dynamic_lane;
lane_marking *lm_A;
lane_marking *lm_B;
time_t change_time;
direction_way new_dir;
public:
change_lane(lane *dl, time_t ct, direction_way new_dir) :
dynamic_lane(dl), lm_A(dl->get_mark_A()), lm_B(dl->get_mark_B()), change_time(ct), new_dir(new_dir) {}
void run()
{
QMutex mux;
mux.lock();
cout << "CHANGING DYNAMIC LANE" << endl;
switch(new_dir)
{
case A:
lm_A->change_status(changing_sw);
lm_B->change_status(changing_df);
break;
case B:
lm_A->change_status(changing_df);
lm_B->change_status(changing_sw);
break;
}
sleep(change_time);
switch(new_dir)
{
case A:
lm_A->change_status(same_way);
lm_B->change_status(different_way);
break;
case B:
lm_A->change_status(different_way);
lm_B->change_status(same_way);
break;
}
dynamic_lane->setDirection(new_dir);
cout << "DONE: CHANGING DYNAMIC LANE" << endl;
mux.unlock();
}
};
這是我如何調用線程;
這是另一個在while(true)循環中運行的線程;
線程只被調用一次,因爲它將w-> changing_lane設置爲false;
//CHECKING IF DYNAMIC ROAD MUST CHANGE
if(w->changing_lane == true)
{
direction_way temp_dirway = w->dyn_lane->getDirection();
switch(temp_dirway)
{
case (A):
{
change_lane cl_A(w->dyn_lane,5,B);
cl_A.start();
break;
}
case (B):
{
change_lane cl_B(w->dyn_lane,5,A);
cl_B.start();
break;
}
}
w->changing_lane = false;
}
當我按下按鈕,我得到這個錯誤:
而且程序只是停止響應。
在應用程序的輸出,我得到這個錯誤:
QThread: Destroyed while thread is still running QMutex: destroying locked mutex ASSERT failure in QThread::setTerminationEnabled(): "Current thread was not started with QThread.", file thread\qthread_win.cpp, line 641
請幫
你正在''run'函數中聲明一個互斥體*,互斥體然後被鎖定並且不會被提供給其他人。因此,其他人實際上正在使用該互斥鎖。這使得各種警鐘在我的腦海中響起。 – peppe
我試着用QMutex,它沒有工作,同樣的問題! –
也許你應該在if語句之外的地方(甚至是while循環)實例化cl_A和cl_B。然而,這意味着你將無法將參數A,B傳遞給構造函數,所以你必須定義另一個類方法來實現這一點。 – finmor