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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: проблема с многопочностью  (Прочитано 11698 раз)
Странник
Гость
« Ответ #15 : Июль 25, 2011, 14:34 »

да, на лабах попадалось, но что-то не найду. что касается документации по qthread, сообщество просит дополнения: http://developer.qt.nokia.com/doc/qt-4.7/qthread.html
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #16 : Июль 25, 2011, 14:45 »

Кстати в этом новом примере совершенно не очевидно где безопасно уничтожить worker и как об этом не забыть.
Записан
Странник
Гость
« Ответ #17 : Июль 25, 2011, 15:01 »

Кстати в этом новом примере совершенно не очевидно где безопасно уничтожить worker и как об этом не забыть.

это всего лишь предложение дополнить документацию, могут и сами исчерпывающий пример на эту тему написать = ) а для любопытствующих в конце заметки приведена ссылка:
Цитата: Andre
Many more hints and details, including the pitfalls of using QThread in combination with signals and slots, can be found this must read wiki article [developer.qt.nokia.com].
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #18 : Июль 25, 2011, 15:11 »

а для любопытствующих в конце заметки приведена ссылка
Там нет ответа на мой вопрос.
Записан
Странник
Гость
« Ответ #19 : Август 04, 2011, 14:56 »

Там нет ответа на мой вопрос.
там есть все, что нужно знать, чтобы сделать это верно. а однозначного ответа по-моему не существует, все зависит от архитектуры приложения. worker должен быть уничтожен до завершения event loop потока. грубо говоря:
Код:
QThread *thread = new QThread;

Worker *worker = new Worker;
worker->moveToThread(thread);

thread->start();

connect(this, SIGNAL(workReady()), worker, SLOT(doWork()));
connect(worker, SIGNAL(workDone()), this, SLOT(processResult()));
connect(worker, SIGNAL(destroyed()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
остается не забыть удалить объект worker, когда он больше не нужен. например, в processResult() вызовом Worker::deleteLater() через очередь.
« Последнее редактирование: Август 04, 2011, 15:10 от Странник » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #20 : Август 04, 2011, 15:39 »

В общих чертах понятно, хотя если приложение закрывают, то в главном потоке мы вываливаемся из QCoreApplication::exec() и дальше завершения потоков мы не дождёмся никогда - последние 2 коннекта не сработают так как обработчика событий в главном потоке уже нету (для тех QThread что были порождены в главном потоке).
Ну а не дожидаться окончания работы воркером может быть чревато битыми файлами и прочими пузиблинчиками ( в зависимости от того, что делают данные воркеры ).
Записан
Paul
Гость
« Ответ #21 : Август 17, 2011, 15:18 »

Добрый день, коллеги. Есть вопрос по потокам: для работы клиента создал объект, к-ый использует 3 дочерних потока (приёмник, обработчик и передатчик), которые создаются и стартуют в конструкторе объекта. Чтобы рабочие данные принадлежали самим потокам, их создание и cоnnect-ы определены в run(). Если в главной прог-е создание и выполнение
1-ой операции выполнить без задержки, то "дочки-поточки" не успевают "разогнаться" полностью, т.к. start() только запускает run() и не ждёт его выполнения, что понятно (если exec(), то не дождёшься).
НУЖНА ПАУЗА !!!

Я по своей малости знания QT решил задачку так: разделил создание и выполнение 1-ой операции на две функции, в конце 1-ой (после создания объекта в окне) выполнил
QTimer::singleShot(500, this, SLOT(executOper()));
где, как легко догадаться executOper() - выполнение операции.

С моей колокольни - как-то коряво. Так и хочется после start() написать wait(), но для какого потока Непонимающий У меня не получилось. Поделитесь пожалуйста знаниями.
   С уважением, Paul
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #22 : Август 17, 2011, 15:30 »

1-ой операции выполнить без задержки, то "дочки-поточки" не успевают "разогнаться" полностью, т.к. start() только запускает run()
И? Покажите что вы пытаетесь сделать с потоками.
Чего вы дождаться хотите? exec()? Входа в run()? Выхода из run()?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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