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


Автор: null56 19.12.2008, 10:55
Хотел узнать, правильно ли понимаю функционирование в классе Qthread

Допустим у меня есть основная программа, в которой я определяю объект класса Qthread или его дочерний свой класс. Внутри класса есть метод start, который порождает нить, исполняемый код которого я реализую переопределяя функцию run()... то есть фактически нить создается только тогда, когда мною будет вызван метод start()

Если вышесказаного мною верно, то тогда возникает небольшая непонятка....

Допустим класс Thread содержит в себе объект QSocket и сигнал от сокета соединен с каким - нибудь слотом класса Thread. В сокете происходит изменение и в слоте это где - нибудь фиксируется.

Вопросы:
обработкой слота будет заниматься основной поток, а не вторичный созданный в классе Thread?
тогда подскажите, можно ли заставить вторичный поток обрабатывать сигналы от сокета, просто додуматься не могу, как это сделать?

Автор: null56 19.12.2008, 11:28
Сейчас читаю инфу,  я так понял, что это можно реализовать через класс QEventLoop
То есть в функции run() создать экземпляр этого класса 
Код

QEventLoop event_loop;

и запустить
Код

event_loop.processEvents();


Но как потом отлавливать события и каких обрабатывать от того же сокета? где переопределение надо сделать? связать их со слотами обработки...
Сейчас меня интересует вопрос реализации

Автор: feanor59 19.12.2008, 13:00
для того, чтобы распаралелить работы механизма сигнал/слотов, т. е. чтобы сигналы обрабатывались в том потоке, в котором определён слот, нужно запустить цикл выполнения в каждом таком потоке, для этого надо вызвать метод exec() в методе run().

Автор: null56 19.12.2008, 15:40
И больше ничего не надо, связь сигналов со слотами где определять надо? можно и в первичном потоке сделать?

Автор: null56 19.12.2008, 16:50
А пример можно? я не совсем понимаю идею использования QEventLoop. Сигналы - то использовать нужно или нужно уже переопределять обработчики события? 

В общих чертах может кто - нибудь описать работу QEventLoop

Автор: feanor59 19.12.2008, 16:56
больше ничего не надо. где связывать сигналы и слоты - не важно (если я не путаю).
т. е. ты связал сигналы со слотами в потоке. запустил поток, в методе ран выполнился exec() и теперь сигналы будут обрабатываться в дочернем потоке (НО, вообще это очевидно, но на всякий случай, если ты будешь вызывать слот как обычный метод, то он будет выполнятся в контексте вызвавщего потока)

Автор: null56 22.12.2008, 12:36
Да идея понята.... Приведу пример моих экспериментов, который запускает в потоке дочерний eventloop, генерит сигнал, а потом закрывает eventloop

Класс Thread
Код

class Thread : public QThread
{
    Q_OBJECT

    public:
        Thread(QObject * pParent = 0);
        ~Thread();
              
        void stopEventLoop();
        void emitSignal();

    signals:
        void messaga();

    public slots:
        void showMessage();

    protected:
        void run();



Thread.cpp
Код

Thread :: Thread(QObject * pParent) :
    Thread(pParent),
    mMaxClients(0),
    mFreeCells(0)
{
    connect(this, SIGNAL(messaga()), this, SLOT(showMessage()));
}

Thread :: ~Thread()
{
    // free resources
}


void Thread ::  run()
{
    exec();
    qDebug("start localevent");   // ЭТО СООБЩЕНИЕ ВЫВЕДЕТСЯ ТОЛЬКО ПОСЛЕ СТОПА eventloop
}

void Thread :: stopEventLoop()
{
    qDebug("stop thread");
    exit();
}

void Thread :: emitSignal()
{
    emit messaga();
}

void Thread :: showMessage()
{
    qDebug("My message");
}


ну и собственно main.cpp
Код

Thread th;
th.start();
qDebug("Start");
th.emitSignal();
sleep(5);
qDebug("wake");
th.stopEventLoop();


Собственно вывод в консоль
Код

Start                  // Из мейна вывод
My message       // После генерирования сигнала
wake                 // Мейн проснулся
stop thread        // Вызов закрытия евентлупа
start localevent   // а вот собсвтенно и то сообщение, которое находится в run, ниже старта eventloop
run start


Большое спасибо, что помогли разобраться

Автор: null56 23.12.2008, 21:30
правильный ответ видимо вот тут
http://forum.vingrad.ru/forum/topic-241300/kw-qthread-movetothread-qsslsocket.html

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