2016-10-31 45 views
0

我正在使用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 Error

而且程序只是停止響應。

在應用程序的輸出,我得到這個錯誤:

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

請幫

+3

你正在''run'函數中聲明一個互斥體*,互斥體然後被鎖定並且不會被提供給其他人。因此,其他人實際上正在使用該互斥鎖。這使得各種警鐘在我的腦海中響起。 – peppe

+0

我試着用QMutex,它沒有工作,同樣的問題! –

+0

也許你應該在if語句之外的地方(甚至是while循環)實例化cl_A和cl_B。然而,這意味着你將無法將參數A,B傳遞給構造函數,所以你必須定義另一個類方法來實現這一點。 – finmor

回答

1

父線程控制子線程通過QThread的object.Consequently的的QThread對象的生命週期應該比更大線程的生命週期。在啓動線程之後,您應該等待線程完成後再刪除它。調用QThread :: wait()來做到這一點。

您在線程中聲明的互斥量不會執行任何操作,因爲它對線程是本地的。一個互斥體的要點是使用它從不同的線程來保護它們之間共享的數據(所以互斥體必須可以被多個線程訪問以供任何使用)。

相關問題