![]() |
|
|
![]()
|
|
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В голове творится полная каша, поэтому вопрашаю вашей помощи.
Абстрактная ситуация-пример. Жмем на кнопку - запускается класс на основе QThread, поток. Где-то в методе run() идут последовательные вызовы методов:
Скажем method1() проверяет какой текст написан в QLineEdit, если написан нужный текст, то делает что-то и ждет сигнала, скажем сигнал returnPressed от QLineEdit. Как только сигнал был получен - переходим к методу method2, который делает уже другие действия, но также ждет определенного сигнала, после которого может перейти к method3(). Или если проверки в методах не удовлетворяют условиям, то цикл run() должен начинаться заново, или поток должен и вовсе завершаться. Методы буду добавляться, меняться местами и т.п. в процессе написания программы, возможно будут вынесены вообще в ECMAScript's. Также будет бесконечный метод (while (1)), который будет сканировать содержимое объекта другого потока и при наличии нужных изменений - выходить из метода с булевским флагом. На данном этапе не срабатывает межпотоковый QObject::connect, который задается в конструкторе класса, который раньше небыл наследником QThread и слоты срабатывали на сигналы, после наследования - перестали. Также перестала работать "затычка" в виде QEventLoop, которая выполняла роль "ожидалки сигнала" и бесконечный цикл выходил в слоте по loop.exit(). Для тех, кто хочет посоветовать избавиться от потока и сделать все в главном цикле. Вышеприведенная ситуация - упрощенная. Реальная задача без потока обойтись не может, т.к. используемый в программе компонент не достаточно гибок для подобной ситуации, в некоторых случаях не шлет никаких сигналов об изменении состояния объекта, в потоке это состояние периодически отслеживается. |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 1 Всего: 261 |
SABROG, делал сейчас что-то подобное. Только у меня очередь из задач которые надо в потоках выполнять, плюс иногда один должен ждать другой.
Я сделал таким образом. Один из потоков стартует по сигналу завершения другого (это переход от одного к другому). То, что надо иногда ждать... Попробуй глянь QThreadPool. Мне он - не подошел, но для тебя вроде бы подходит, т.к. тебе надо сделать очередь 1-1-1-1, а у меня было сложнее. |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Так, ну почему не работали слоты я понял. Не работает без макроса Q_OBJECT.
Причем до этого у меня был класс с этим макросом и наследовался от QObject'a. Когда добавил еще QThread, получилось так:
Компилер сгругался на QObject, типа QThread уже на базе QObject'a. Я тогда тупо зарубил и макрос убрал наследование. По идее сейчас и QEventLoop должен начать работать. Будем тестить. --- Не, QEventLoop иногда вешает прогу намертво несмотря на то, что в отдельном потоке, а иногда просто крашит. Патаюсь делать мутку с QTimer'ом в отдельном классе на базе QObject'a как тут предлагают , но проблема в том, что цикл получается одиночным для одного потока, а мне надо для каждого метода. Это сообщение отредактировал(а) SABROG - 10.9.2008, 15:26 |
||||
|
|||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Вопрос, в принципе, подходит по эту тему.
Есть поток, который запускается по сигналу из основного потока. Все работает, но не каждый раз. То есть не после каждого emit запускается второй поток. Почему так может быть? |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Я недопонял. У тебя есть основной поток и дополнительный поток из которого ты запускаешь третий поток или у тебя тупо в основном потоке тред не запускается в слоте ?
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
В основном потоке:
когда эмитится сигнал в основном потоке, то не всегда запускается второй поток.(всего 2 потока) |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А он успевает завершиться ?
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
да. В моей софтинке, если ее разворачиваешь из трея и работает вторичный поток, то некоторые кнопки неактивны. То есть завершение второго потока происходит до следующего запуска.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В консоль ничего не пишет ?
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
qDebug ?
не совсем понял вопрос |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Да, ядровый. Когда прогу с CONFIG += console собираешь
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
нет. Такого нету. Консоли нет. Только работа с БД
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Ну ты .pro файл временно отредактируй, чтобы глянуть. Может что-нить из этого вывестись, если есть ошибка:
|
|||
|
||||
| Acer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
изменил немного метод:
Увидел, что в некоторые моменты бывает, что пишется
но потом ничего не происходит. То есть раньше ругался на SQL, а теперь ничего не произошло... нормально запустился: ![]() не запустился |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А поставь qDebug в начало метода run(). Может поток крашится где-то ?
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Вот мой метод run()
Может проблема была с msleep? Когда я использую wait вместо msleep, то вроде бы все работает...
|
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Что-то я не понял как работает wait
Если использовать msleep, то есть вот такое сообщение:
Как правильно сделать задержку в работе потока? Чтобы он работал не все время, а один раз в 60 секунд. |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А для чего тебе поток я понять не могу ? refresh() блокирует главный цикл ? Почему бы тогда не сделать так. В слоте который сворачивает в трей запускаем QTimer, с нужной периодичностью он будет вызывать start() у потока, если тот не запущен. |
|||
|
||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
В refresh происходит обмен с базой.
Прога работает в трее. Второй поток нужен для того, чтобы при обмене с базой не зависал гуй и приложение можно было "достать" из трея в любой момент. Сделал с QTimer. Все работает. Спасибо |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, 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. |