2016-10-31 48 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()来做到这一点。

您在线程中声明的互斥量不会执行任何操作,因为它对线程是本地的。一个互斥体的要点是使用它从不同的线程来保护它们之间共享的数据(所以互斥体必须可以被多个线程访问以供任何使用)。

相关问题