Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Потоки


Автор: Ober 22.11.2012, 14:50
Подскажите пожалуйста мне как работают классы унаследованные от QThread и запущенные с помощью метода 
void run(). Я так понимаю если объект класса, унаследованного от QThread запускается в функции main(), то он не дожидаясь завершения запущенного потока возвращает управление назад функции main() ?
В этом коде функция main() ждет завершения потока NewThread, а потом уже печатает текст с помощью QDebug(). Проясните пожалуйста мне что на самом деле происходит.

Код

#include <QtGui>
#include "mainwindow.h"
#include "ticketmanager.h"
#include "insertBuyTickets.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    static TicketManager tm;
    
    InsertBuyTickets isb( &tm );//Унаследован от QThread

    MainWindow w( &tm );
    w.show();

    isb.run();//Запускаем новый поток
    qDebug() << QTime::currentTime().toString();

    return a.exec();
}

Автор: borisbn 22.11.2012, 14:56
функция run недоступна снаружи. чтобы запустить поток нужно вызвать start, а чтобы дождаться окончания - вызвать wait:
Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    static TicketManager tm;
    
    InsertBuyTickets isb( &tm );//Унаследован от QThread
    MainWindow w( &tm );
    w.show();
    isb.start();//Запускаем новый поток
    qDebug() << QTime::currentTime().toString();
    int res = a.exec();
    isb.enough();
    isb.wait();
    return res;
}

// h
class InsertBuyTickets : public QThread {
...
    void enough();
    bool m_abort;
};
// cpp
void InsertBuyTickets::enough() {
    m_abort = true;
}
void InsertBuyTickets::run() {
    while ( ! m_abort ) {
    ...
    }
}

Автор: loneybibi 22.11.2012, 14:57
поток надо запускать с помощью start()

Автор: Ober 22.11.2012, 15:01
Спасибо вам большое. Помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)