Russian Qt Forum
Ноябрь 24, 2024, 14:51
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Завершнение QThread
Страниц:
1
2
[
3
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Завершнение QThread (Прочитано 22564 раз)
zodiac
Гость
Re: Завершнение QThread
«
Ответ #30 :
Ноябрь 08, 2008, 20:55 »
Цитата: Константин от Ноябрь 08, 2008, 20:49
> while (пока_не_ошибка_от_сервера)
это типа эмуляции петли событий? ведь таким образом ты ограничиваешь всю архитектуру на использование производных потоков, что не очень-то гибко. а почему так, а не через полноценный QEventLoop?
Так как библиотека написана на C++, без QT.
Цитата: Константин от Ноябрь 08, 2008, 20:49
упд:
> пока_не_ошибка_от_
сервера
означает ли это, что такой цикл имеется в каждом потоке соединения с сервером? т.е. в аська-протоколе свой цикл, в жаббер-протоколе - свой и т.д.?
Я джаббере -- в каждом потоке такой цикл, а аське же нет. Аська писалась на C++/QT без всяких сторонних библиотек.
Записан
ритт
Гость
Re: Завершнение QThread
«
Ответ #31 :
Ноябрь 08, 2008, 21:45 »
Цитата: zodiac от Ноябрь 08, 2008, 20:55
Цитата: Константин от Ноябрь 08, 2008, 20:49
> while (пока_не_ошибка_от_сервера)
это типа эмуляции петли событий? ведь таким образом ты ограничиваешь всю архитектуру на использование производных потоков, что не очень-то гибко. а почему так, а не через полноценный QEventLoop?
Так как библиотека написана на C++, без QT.
Цитата: Константин от Ноябрь 08, 2008, 20:49
упд:
> пока_не_ошибка_от_
сервера
означает ли это, что такой цикл имеется в каждом потоке соединения с сервером? т.е. в аська-протоколе свой цикл, в жаббер-протоколе - свой и т.д.?
Я джаббере -- в каждом потоке такой цикл, а аське же нет. Аська писалась на C++/QT без всяких сторонних библиотек.
а, так это в библиотеке...
сервер-то всё-равно не может инициировать события, пока нет коннекта - зачем же тогда держать дохлый поток?
вот я и говорю: если функции в библиотеке потокобезопасные (thread-safe), то всю работу с протоколом можно спихнуть на поток, который будет жить вплоть до разрыва соединения (если не thread-safe, то можно написать потокобезопасный wrapper), всю работу по взаимодействию клиентской части с сервером - на менеджер таких потоков, т.е. как бы минуя вопросы протокола...
м.б. я слишком размечтался (в смысле, что, возможно, архитектуру пересматривать уже никто не собирается), но таким образом можно оставить вообще один менеджер потоков (протоколов) для любого количества соединений (с определённым программным интерфейсом) и получить в итоге примерно такую модель:
/--- акк_icq_1
г--- плагин icq --- +--- акк_icq_2
| /|\ \--- акк_icq_3
| |
| \|/
гуй --- менеджер соединений
| /|\
| |
| \|/ /--- акк_jabber_1
L--- плагин jabber --- +--- акк_jabber_2
\--- акк_jabber_3
здесь каждый поток самодостаточен и напрямую не влияет на гуй или менеджер, так что, даже если поток ушёл в глубокие раздумья, гуй от этого не пострадает, а пользователь только увидит, что мессаги становятся в очередь, но не отправляются...а там можно и безболезненно рвануть по таймауту, если потоку совсем плохо...
снова сравню с мирандой - там используется упрощённая модель: гуй <-> менеджер соединений <-> кучка потоков; но главное отличие, что гуй зависим от потоков - из-за этого часто случаются подвисания (например, при разрыве сединения в некоторых протоколах).
если все "внешние" операции производить в отдельном потоке, а связывать события с гуём только через очередь, гуй(основной поток) вообще будет заниматься только рисованием и взаимодействием с пользователем, не беспокоясь о проблемах сети и т.п.
Записан
BRE
Гость
Re: Завершнение QThread
«
Ответ #32 :
Ноябрь 08, 2008, 21:49 »
Цитата: BRE от Ноябрь 08, 2008, 19:00
Можно попробовать сделать отдельную нить, которая будет следить за состоянием всех соединений. Если происходит подключение, то запускает требуемую нить, если отключение - останавливает.
Вроде это и предлагал, чуть выше.
+ Это позволит разрулить ситуацию с контекстами нитей. Запускаться и убиваться нити будут из одного контекста.
«
Последнее редактирование: Ноябрь 08, 2008, 21:52 от BRE
»
Записан
zodiac
Гость
Re: Завершнение QThread
«
Ответ #33 :
Ноябрь 08, 2008, 22:05 »
Аську вообще сюда не надо приплетать. Там никто ничего переписывать не будет уже :-)
В принципе щас можно разделить яббер на еще 1 поток и остальные потоки, которые будут запускаться из того (я правильно понял?), но это уже не сегодня.
Я не совсем понял как лучше сделать. Когда запускать этот поток? И как из него уже управлять другими.
Записан
ритт
Гость
Re: Завершнение QThread
«
Ответ #34 :
Ноябрь 08, 2008, 22:22 »
запускать такой поток (менеджер соединений) можно сразу при инициализации плагина, прибивать перед выгрузкой плагина. на запрос менеджеру о соединении с сервером создаётся и запускается ведомый поток, который прибивается при возникновении ошибки или нормальном дисконнекте. останавливать его и затем снова запускать практически не имеет смысла, но это уже не суть важно.
если предполагается, что такой менеджер занимается только жаббер-протоколом, то прямо в нём можно реализовать какие-то общие безопасные для дочерних потоков слоты.
как побочный эффект такого разделения появится возможность в одном плагине создавать и контролировать более одного соединения с сервером (серверами) - если архитектура qutim позволяет, в настройках плагина можно дать пользователю возможность указать несколько аккаунтов или добавить/удалить. ))
Записан
BRE
Гость
Re: Завершнение QThread
«
Ответ #35 :
Ноябрь 08, 2008, 22:49 »
Цитата: Константин от Ноябрь 08, 2008, 20:16
> Задержки могут быть и в обработчиках сигналов...
между потоками? ну-ну
Моя запарка.
В моем тестовом примере, слоты выполнялись в контексте главного треда.
Записан
zodiac
Гость
Re: Завершнение QThread
«
Ответ #36 :
Ноябрь 08, 2008, 23:42 »
Цитата: Константин от Ноябрь 08, 2008, 22:22
если архитектура qutim позволяет, в настройках плагина можно дать пользователю возможность указать несколько аккаунтов или добавить/удалить. ))
Архитектура отдает все проблемы плагина -- плагину. Завтра днем посмотрю эту идею, если время хватит.
Записан
naico
Гость
Re: Завершнение QThread
«
Ответ #37 :
Ноябрь 10, 2008, 13:45 »
А подскажите средство в духе kill, чтобы действовало решительно и беспощадно:)
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Завершнение QThread
«
Ответ #38 :
Ноябрь 10, 2008, 13:57 »
Цитата: naico от Ноябрь 10, 2008, 13:45
А подскажите средство в духе kill, чтобы действовало решительно и беспощадно:)
Цитировать
void QThread::terminate ()
[slot]
Terminates the execution of the thread. The thread may or may not be terminated immediately, depending on the operating systems scheduling policies. Use QThread::wait() after terminate() for synchronous termination.
When the thread is terminated, all threads waiting for the thread to finish will be woken up.
Warning: This function is dangerous and its use is discouraged. The thread can be terminate at any point in its code path. Threads can be terminated while modifying data. There is no chance for the thread to cleanup after itself, unlock any held mutexes, etc. In short, use this function only if absolutely necessary.
Termination can be explicitly enabled or disabled by calling QThread::setTerminationEnabled(). Calling this function while termination is disabled results in the termination being deferred, until termination is re-enabled. See the documentation of QThread::setTerminationEnabled() for more information.
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
naico
Гость
Re: Завершнение QThread
«
Ответ #39 :
Ноябрь 10, 2008, 14:20 »
Спасибо, но мне это не помогает в случае, если в треде идет обращение к файловой системе удаленной машины, допустим, к несуществующей папке. Тогда тред ожидает (видимо по таймеру) ответа, и на terminate не реагирует.
Ситуация, конечно, нестандартная для работы программы, но все ж хочется ее обрабатывать, по крайней мере убивать процесс.
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Завершнение QThread
«
Ответ #40 :
Ноябрь 10, 2008, 14:34 »
В таком случае организовывайте собственные таймауты, и собственно "таймаут" и будет условием выхода из потока
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
Re: Завершнение QThread
«
Ответ #41 :
Ноябрь 11, 2008, 21:41 »
Разобрался с потоками. Большое спасибо BRE
Записан
Страниц:
1
2
[
3
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...