crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  « < 2 3 4  
Ответить в данную темуНачать новую тему
> Qthread & сигналы
BRE
  опции профиля:
сообщение 9.12.2009, 10:41
Сообщение #31


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 10:37) *
Так вот в signalReceived() он не заходит...

Так в потоке не запущен цикл обработки событий (QThread::exec).
Все сигналы между потоками ходят через события, а если события не обрабатываются, то и сигналы не доходят.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 10:51
Сообщение #32


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 8.12.2009
Пользователь №: 1289

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 11:05
Сообщение #33


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 10:51) *
Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее...

Я не поклонник такого использования сигналов в потоках, проще и IMHO лучше, не держать поток в простое на каком то флажке, а запускать его в тот момент, когда нужно что-бы он что-то сделал. После завершения работы она завершиться и все.

Но если очень хочется, то можно делать примерно так:
Раскрывающийся текст

class Thread : public QThread
{
    Q_OBJECT
public:
    Thread() : QThread( 0 ) { moveToThread( this ); }

public slots:
    void job1()
    {
        qDebug() << "Job 1";
        ...
    }

    void job2()
    {
        qDebug() << "Job 2";
        ...
    }

protected:
    void run()
    {
        exec();
    }
};


Если соединится со слотами job1 и job2 из другого потока, то при активации они будут выполняться в контексте потока.
Т.е. нет нужды ждать в потоке изменение какого-то флага и запускать действие, QThread::exec сам будет ждать сигнала и запустит действие (нужный слот).

Сообщение отредактировал BRE - 9.12.2009, 11:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:08
Сообщение #34


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 8.12.2009
Пользователь №: 1289

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 11:13
Сообщение #35


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 11:08) *
Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время...

Если задачи таковы, то конечно нужно использовать...
Посмотри еще на QThreadPool.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:16
Сообщение #36


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 8.12.2009
Пользователь №: 1289

Спасибо сказали: 0 раз(а)




Репутация:   0  


К сожалению, у меня Qt 4.3, там его еще нету, но все равно гляну, спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.12.2009, 11:43
Сообщение #37


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(OrSOn @ 9.12.2009, 12:51) *
не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят...
из описания к макросу Q_DECLARE_METATYPE ( Type ):
Цитата
Note that if you intend to use the type in queued signal and slot connections, you also have to call qRegisterMetaType() since such connections are resolved at runtime.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:55
Сообщение #38


Студент
*

Группа: Участник
Сообщений: 46
Регистрация: 8.12.2009
Пользователь №: 1289

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ясно, спасибо =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  « < 2 3 4
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


16 чел. читают эту тему (гостей: 16, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.1.2025, 16:10