QThread не прекращает работу(((, QThread |
Здравствуйте, гость ( Вход | Регистрация )
QThread не прекращает работу(((, QThread |
silver47 |
7.10.2011, 18:18
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
С Qt идет пример Thread Fortune Server, но его особенность такова:
входящее соединение -> создается поток, поток делает свою работу по списку последовательно и завершается Вы внесли изменение, воткнули цикл forever в поток. Это не есть верно. посмотрим на то, что содержит реализация потока сервера. Она состоит из конструктора класса и метода run:
Что поменять? Логично, что сокет нужно создавать в конструкторе и не на стеке а на куче т.е так:
Соединить необходимые сигналы... здесь конкретно самым необходимым будет socket::readyRead(), который сообщает о том что данные в сокет просочились. А в методе run достаточно будет лишь запустить обработчик событий:
В догонку измененный текст QThreadFortune Server. Теперь он создает сокет, и молчит, при получении данных вываливает их в дебаг. Висит до тех пор пока клиент не отключиться. Ждет подключения на любом адресе на порту пять пятерок При подключении с локалхоста так и указывайте в терминале localhost:55555 Сообщение отредактировал silver47 - 7.10.2011, 18:42
Прикрепленные файлы
|
|
|
fortero |
8.10.2011, 13:32
Сообщение
#12
|
Участник Группа: Участник Сообщений: 132 Регистрация: 4.12.2010 Пользователь №: 2242 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем спасибо разобрался!
|
|
|
sidsukana |
7.11.2011, 22:09
Сообщение
#13
|
Участник Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: 2 |
Сделал все как сказано. В конструкторе инициализация сокета. В run() Добавил waitForDisconnect(). Почему при не получается удалить поток?
Тут slotTest срабатывает. connect(thread, SIGNAL(finished()), this, SLOT(slotTest())); Тут deleteLater нет. Или я чего то не понимаю и деструктор вызывается не сразу? connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); Сообщение отредактировал sidsukana - 7.11.2011, 22:12 |
|
|
Гость_Гость_AK__* |
8.11.2011, 11:18
Сообщение
#14
|
Гости |
Простите, может немного не по теме, но имел очень печальный опыт Delphi+асинхронный сокет Windows: по UDP около 2000 пакетов/сек (по 10кБ каждый). Система просто ложилась. Переделал на синхронный прием в отдельном потоке - все забегало как надо. Кто-нибудь имеет опыт использования Qt-реализации "на сигналах" в подобных условиях (много пакетов в секунду)?
|
|
|
ssoft |
8.11.2011, 15:54
Сообщение
#15
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
Пардон, не всю тему прочитал.
А так если вернуться к началу, то можно что-то типа этого ))). Пример 1. Завершение потока.
Пример 2. Слушающий сокет в потоке (без наворотов).
Не забыть удалить socket. Сообщение отредактировал ssoft - 8.11.2011, 15:58 |
|
|
Гость_Galaxycon_* |
17.4.2012, 14:07
Сообщение
#16
|
Гости |
Вот что смущает...
В переделанном примере (аттач threadedfortuneserver.zip ) Объект TcpSocket Создается в конструкторе. И ему назначаются слоты нити, которая будет создана. Но тогда TcpSocket будет не принадлежать потоку? Может вернее его создавать все же в run()? |
|
|
Текстовая версия | Сейчас: 28.1.2025, 21:40 |