Qt线程和循环问题

ale*_*p86 0 c++ qt multithreading qthread

这是QThread的子类的run方法:

void crono::Controller::run() {

    //initialise timer
    int *i = & this->model->seconds_elapsed;

    for (*i = 0; *i < this->model->seconds_total; (*i)++) {

    //calculate current seconds/minutes/hours elapsed starting  from seconds_elapsed (*i)
    this->model->tick(); 

    //should display in the form the time elapsed
    this->vista->showTime(); 
    sleep(1000);


    }

    Beep(1000, 500); //beep when all is over

}
Run Code Online (Sandbox Code Playgroud)

控制器更新模型值.

QT表单在启动时打开,我猜在主应用程序线程中.

问题是对debug*i = 0和seconds_total = X> 0的鄙视,循环只执行一次,在第一次调试停止(它没有结束)之后,表单弹出但没有任何反应.

我唯一可以猜到的是,Controller Thread失去了优先级,再也没有获得cpu.

怎么能避免这个?

编辑 我正在尝试使用QTimer,运气不好.

我将更新声明为公共插槽,然后实现如下:

void crono::Controller::update() { 

    this->modello->tick();
    this->vista->showTime();

    //eventually stop at some point (pointer to timer and timer->stop()? 
    //...
    //Beep(1000, 500);
}  
Run Code Online (Sandbox Code Playgroud)

我将QTimer插入控制器(线程)对象而不是循环周期:

void crono::Controller::run() {

    //inizializzo timer
    int *i = & this->modello->secondi_trascorsi;

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()),this, SLOT(update()));
    timer->start(1000);


}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但是从不调用update()方法,而是被无限次调用.为什么?

Jon*_*per 5

常见的困惑是QThread在自己独立的线程中运行.不是这种情况; 相反,QThread它在它控制的子线程中启动一个事件循环.QThread很容易被称为QThreadManager.

简而言之,不要子类化QThread,因为您创建的功能驻留在主线程(而不是QThread处理的线程)中.创建一个QObject子类,其中一个插槽连接到started()信号.然后使用moveToThread()并调用run()您的QThread实例.

此外,您不能直接从子线程调用主线程函数.您需要一个排队的连接信号到主线程中的对象以显示该对话框.