Russian Qt Forum
Ноябрь 26, 2024, 20:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qthread::exec()  (Прочитано 11246 раз)
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", но выводится она единожды.
Записан
KADABRA
Гость
« Ответ #1 : Январь 25, 2010, 12:58 »

Подскажите в чем может быть проблема?
В коде MyTask::run() - он исполняется один раз, почему должно быть "много-много строк"?
Пишите тогда так
Код:
void MyTask::run()
{
    while(1)
    {
        qDebug("qwerty");
    }
}
Записан
enamored
Гость
« Ответ #2 : Январь 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
Записан
niXman
Гость
« Ответ #3 : Январь 25, 2010, 13:12 »

Цитировать
как я понимаю.
неверно понимаете.
Записан
enamored
Гость
« Ответ #4 : Январь 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.
« Последнее редактирование: Январь 25, 2010, 13:23 от enamored » Записан
Akaiten
Гость
« Ответ #5 : Январь 25, 2010, 13:36 »

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

Спасибо, Akaiten.
Записан
Amigo_sa
Гость
« Ответ #7 : Январь 25, 2010, 17:28 »

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

forever смотрится красивее Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.