![]() |
|
|
![]()
|
|
| feanor59 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
И так. Нужен совет.
Цель: синхронизировать старт потоков, т. е. добиться, чтобы инструкция, следующая после abstractThread.start(); выполнялась только после выполнения метода abstractThread.run(); причём желательно организовать незанятое ожидание. Ниже приведены пара моих решений. Если есть варианты лучше, отпишите.
Проблема же такая возникла из-за того, что в run() инициализируется объект QTextStream, но иногда до этого выполняется один из слотов, как следствие - краш. Это сообщение отредактировал(а) feanor59 - 12.10.2008, 19:00 |
|||
|
||||
| feanor59 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
мда. как выяснилось, рабочий только 1й вариант, остальные воспринимаются как дедлок.
UPD: чорд... 1й вариант так же не катит... Это сообщение отредактировал(а) feanor59 - 12.10.2008, 19:28 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
||||
|
||||
| feanor59 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
поток один, не считая основного, и этот поток с этим основным и надо синхронизировать. вот пример: в потоке есть 2 метода:
main выглядит так
Дак вот. Метод run() выполняется позже, чем emit logIt() в методе sendMsg(). Я в курсе, что инициализацию можно в конструктор вынести (точнее я так и сделал), но, тем не менее, проблема осталась, как минимум exec() выполняется позже, чем надо. Это сообщение отредактировал(а) feanor59 - 13.10.2008, 15:02 |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
||||
|
||||
| feanor59 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
не, не вариант. по разному пробовал. результат один. |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
А впиши-ка debug output'ы в местах, которые должны быть синхронизированы.
Возможно, просто не ходят сообщения из-за того, что QCoreApplication ещё не запущен. |
|||
|
||||
| feanor59 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
так. извиняйте, что долго не отписывал, другие дела были. дак вот, качественное снабжение кода qDebug'ами выявили косяк следующего содержания. Инициализация QCoreApplication не успевает к первой высылке сигнала в коде, следовательно сигнал не высылается.
Я, правда, не совсем понимаю связь этого факта с проблемой старта потоков, но так или иначе проблема есть. Как то можно заставить код ждать инициализыции кор апликейшена и как всё таки это может помочь в разрешении проблемы потоков? |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
вынести весь главный код main в отдельный поток? |
|||
|
||||
| feanor59 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
кстати. хорошая идея. Вынести в поток всю инициализацию всего, что возможно, и повесить на это дело сплеш.
Попробую. UPD: а как это спасёт ситуацию с синхронизацией запуска потоков? Это сообщение отредактировал(а) feanor59 - 23.10.2008, 19:50 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
Тогда такой вариант: стартовать logger.start() только по сигналу, сделать emit сигнал перед app.exec(). Этот сигнал, по идее, будет выполнен после app.exec(), следовательно, к моменту запуска потока сигналы-слоты уже в строю.
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |