在QT中从另一个GUI线程调用线程时出现问题

时间:2016-10-31 20:14:54

标签: c++ multithreading qt

我正在使用QT来运行交通项目。 有一点,我创建了一个线程,他必须设置一些变量,等待一段时间,将变量设置为另一个值并死掉; 当这个线程在等待时,其他线程必须继续运行。 这是线程类

//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-&gt; 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

程序停止响应。

在Application Output中,我收到此错误:

  

QThread:在线程仍在运行时销毁QMutex:销毁   QThread :: setTerminationEnabled()中锁定的互斥锁ASSERT失败:   &#34;当前线程未使用QThread启动。&#34;,文件   thread \ qthread_win.cpp,第641行

请帮忙

1 个答案:

答案 0 :(得分:1)

父线程通过QThread对象控制子线程。因此,QThread对象的生命周期应该大于线程的生命周期。启动线程后,您应该等待线程完成后再删除它。调用QThread :: wait()来执行此操作。

你在线程中声明的互斥锁没有做任何事情,因为它是线程的本地。互斥的意义在于使用来自不同线程的数据来保护它们之间共享的数据(因此,多个线程必须可以访问互斥锁才能使用)。