Russian Qt Forum

Qt => Общие вопросы => Тема начата: enamored от Январь 25, 2010, 12:46



Название: Qthread::exec()
Отправлено: enamored от Январь 25, 2010, 12:46
Привет всем!

Подскажите в чем может быть проблема?
Существует поток в котором в цикле выводится debug-сообщение...
Windows XP Sp3, Qt 4.6 и Qt 4.6.1.

Код:
MainWindow.cpp
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    task = new MyTask();
    task->start();
}
MyTask.h
Код:
#ifndef MYTASK_H
#define MYTASK_H

#include <QObject>
#include <QThread>
#include <QtDebug>

class MyTask: public QThread
{
    void run();
};

#endif // MYTASK_H
MyTask.cpp
Код:
#include "MyTask.h"

void MyTask::run()
{
    qDebug("qwerty");
    exec();
}

Ожидаю увидеть много-много строк "qwerty", но выводится она единожды.


Название: Re: Qthread::exec()
Отправлено: KADABRA от Январь 25, 2010, 12:58
Подскажите в чем может быть проблема?
В коде MyTask::run() - он исполняется один раз, почему должно быть "много-много строк"?
Пишите тогда так
Код:
void MyTask::run()
{
    while(1)
    {
        qDebug("qwerty");
    }
}


Название: Re: Qthread::exec()
Отправлено: enamored от Январь 25, 2010, 13:07
Код:
void run()
{
    ...
    exec();
}
Это стандартный способ запуска цикла вунтри потока, как я понимаю.
Вот примеры:
http://thesmithfam.org/blog/2009/09/30/lock-free-multi-threading-in-qt/
http://www.qtforum.org/post/75692/qtimer-event-won-t-process-in-thread-event-loop.html?highlight=Qthread+loop#post75692


Название: Re: Qthread::exec()
Отправлено: niXman от Январь 25, 2010, 13:12
Цитировать
как я понимаю.
неверно понимаете.


Название: Re: Qthread::exec()
Отправлено: enamored от Январь 25, 2010, 13:14
Растолкуйте, пожалуйста.
Цитировать
int QThread::exec ()   [protected]
Enters the event loop and waits until exit() is called, returning the value that was passed to exit(). The value returned is 0 if exit() is called via quit().
It is necessary to call this function to start event handling.


Название: Re: Qthread::exec()
Отправлено: Akaiten от Январь 25, 2010, 13:36
QThread::exec() попросту запускает цикл обработки событий через QEventLoop::exec(). При вызове метода QThread::exit(int returnCode) происходит выход из цикла обработки событий и метод exec() завершает свою работу, возвращая код завершения returnCode. Метод QThread::quit() == QThread::exit(0) == QThread::exit().
Цикл обработки сообщений необходим, если поток и/или объекты, которые в нём так сказать находятся, могли посылать и получать сигналы.


Название: Re: Qthread::exec()
Отправлено: enamored от Январь 25, 2010, 13:41
Спасибо, Akaiten.


Название: Re: Qthread::exec()
Отправлено: Amigo_sa от Январь 25, 2010, 17:28
Подскажите в чем может быть проблема?
В коде MyTask::run() - он исполняется один раз, почему должно быть "много-много строк"?
Пишите тогда так
Код:
void MyTask::run()
{
    while(1)
    {
        qDebug("qwerty");
    }
}

forever смотрится красивее :)