Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Qthread где какая нить? Правильно ли я понимаю функционирование 
V
    Опции темы
null56
Дата 19.12.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Хотел узнать, правильно ли понимаю функционирование в классе Qthread

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

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

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

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

PM MAIL   Вверх
null56
Дата 19.12.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

QEventLoop event_loop;

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

event_loop.processEvents();


Но как потом отлавливать события и каких обрабатывать от того же сокета? где переопределение надо сделать? связать их со слотами обработки...
Сейчас меня интересует вопрос реализации
PM MAIL   Вверх
feanor59
Дата 19.12.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2008
Где: Пермь

Репутация: нет
Всего: нет



для того, чтобы распаралелить работы механизма сигнал/слотов, т. е. чтобы сигналы обрабатывались в том потоке, в котором определён слот, нужно запустить цикл выполнения в каждом таком потоке, для этого надо вызвать метод exec() в методе run().
PM MAIL ICQ GTalk   Вверх
null56
Дата 19.12.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



И больше ничего не надо, связь сигналов со слотами где определять надо? можно и в первичном потоке сделать?
PM MAIL   Вверх
null56
Дата 19.12.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

В общих чертах может кто - нибудь описать работу QEventLoop
PM MAIL   Вверх
feanor59
Дата 19.12.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2008
Где: Пермь

Репутация: нет
Всего: нет



больше ничего не надо. где связывать сигналы и слоты - не важно (если я не путаю).
т. е. ты связал сигналы со слотами в потоке. запустил поток, в методе ран выполнился exec() и теперь сигналы будут обрабатываться в дочернем потоке (НО, вообще это очевидно, но на всякий случай, если ты будешь вызывать слот как обычный метод, то он будет выполнятся в контексте вызвавщего потока)
PM MAIL ICQ GTalk   Вверх
null56
Дата 22.12.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Да идея понята.... Приведу пример моих экспериментов, который запускает в потоке дочерний 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


Большое спасибо, что помогли разобраться
PM MAIL   Вверх
null56
Дата 23.12.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



правильный ответ видимо вот тут
http://forum.vingrad.ru/forum/topic-241300...qsslsocket.html
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.