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