Название: Проблема с QTcpSocket при обрыве соединения Отправлено: sLiva от Марта 03, 2008, 21:32 Проблема заключается в следующем:
Значит, есть клиент-серверное приложение, работа идет асинхронно, все используемые механизмы сетевого взаимодействия стандартны. У клиента есть сокет, причем он один создается и инициализируется при старте клиента. Подключение с сервером осуществляет модальный диалог входа в систему. Работа с сокетом идет нормально, отключается, заново подключается, при обрыве соединения тоже заново подключается, все без проблем. Но когда в главном окне открыт, какой либо модальный диалог, вызванный с помощью QDialog::exec(), и происходит разрыв соединения поведение следующее (при обрыве соединения интерфейс программы блокируется (setEnabled) и вызывается диалог входа в систему который уже в автоматическом режиме пытается восстановить соединение). Так вот если в главном окне не было открыто никакого диалога, то восстановление соединения проходит нормально, но если какой либо диалог открыт, то коннект к серверу происходит нормально, отправляется запрос нормально, а вот сигнал readyRead не генерируется, т.е. сокет адекватно отправляет информацию, но не получает ее, и в результате этого сокет нерабочий, abort() и т.д. не помогают. У меня возникло такое предположение что это как то связано с передачей управления циклу событий модального диалога, но это так предположение. Qt 4.3.0, VS2005 Всем кто откликнется заранее спасибо :-) Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: ритт от Марта 04, 2008, 14:34 > работа идет асинхронно
значит ли это, что сокет инитится в отдельном потоке? скорее всего, сокет у тебя в гуевом потоке, откуда ноги и растут Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: Dodge от Марта 05, 2008, 12:39 1. как присоединен слот к readyRead (директ или очередь)?
2. вы уверенны что сервер вообще чтото отправляет? Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: sLiva от Марта 05, 2008, 20:15 > работа идет асинхронно значит ли это, что сокет инитится в отдельном потоке? скорее всего, сокет у тебя в гуевом потоке, откуда ноги и растут нет сокет инитится в гуевом потоке, в конструкторе главной формы 1. как присоединен слот к readyRead (директ или очередь)? 2. вы уверенны что сервер вообще чтото отправляет? 1. подсоединен в автоматическом режиме, я и не обращал чет внимание на это раньше :-) Сейчас почитал как он работает. У меня свой класс сокета от стандартного, и в нем как раз и обработчик сигнала readyRead, т.е. соединение работает как очередь, т.к. в одном потоке крутятся. 2. уверен на сто процентом, т.к. дебагил сервак, все норм, запрос приходит, ответ улетает. Вообще пока проблему решил так, при обрыве соединения, убиваются все открытые модальные диалоги, и просто блокирую интерфейс а пользователю уже самому приходится открывать заново диалог входа в систему, тогда все норм, сокет рабочий. Т.е проблема всетаки с потоками при вызове диалога входа в автоматическом режиме, чет они там не поделили, или блокируют друг друга, в общем сейчас эта проблема не особо остро стоит, вот когда встанет, тада и буду копать в направлении потоков. Спасибо :-)) Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: ритт от Марта 06, 2008, 12:06 х**се решение :)
если прямо так в лоб, то уж лучше узнавать кто из диалогов сейчас наверху и давать ему сигнал на создание диалога рконнекта правильнее же разделить логику и гуи по разным потокам Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: sLiva от Марта 06, 2008, 19:56 х**се решение :) если прямо так в лоб, то уж лучше узнавать кто из диалогов сейчас наверху и давать ему сигнал на создание диалога рконнекта правильнее же разделить логику и гуи по разным потокам На самом деле решение не такое уж страшное :-)) Работа клиента не возможна без конекта к серваку, они очень тесно работаю друг с другом. А вот на счет узнать какой диалог сверху и ему занятся реконектом это вариант, спасибо попробую. Очень интересно, как это разделить логику и ГУИ. У меня сокет клиента имеет что то типа оберток над поддерживаемыми сервером командами, т.е. методы типа login(name, pass), getЧтонибудь() и т.д. сокет сам обрабатывает ответ сервера, и высылает соответствующие сигналы. Сокет создается в главном окне, он один, если с ним работает какой либо виджет то ему отдается указатель на сокет, вот такая логика. Т.е. правильней будет создать для сокета отдельный поток, и чтобы он там жил ?? А что от этого изменится, поток главного окна же не прерывается ? Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: ритт от Марта 06, 2008, 21:26 kalpa's glan? :)
ладно, а в чём тогда асинхронность? Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: sLiva от Марта 06, 2008, 21:32 kalpa's glan? :) ладно, а в чём тогда асинхронность? имелось ввиду асинхронность работы сокета, в промежуток времени от момента запроса и ответа гуи не блокируется, т.е. использование сигналов вместо блокирующих ГУИ waitFor... :-)) Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: ритт от Марта 07, 2008, 05:45 сразу представил секетутку-бляндинку, 10 раз кликающую, например, "закрыть" в промежутках времени от моментов запроса и ответа...
если каждый такой клик добавляет командный пакет в очередь, то придётся ещё и компрессию комманд реализовывать кинуть ссылку на глан или сам найдёшь? Название: Re: Проблема с QTcpSocket при обрыве соединения Отправлено: sLiva от Марта 10, 2008, 00:16 сразу представил секетутку-бляндинку, 10 раз кликающую, например, "закрыть" в промежутках времени от моментов запроса и ответа... если каждый такой клик добавляет командный пакет в очередь, то придётся ещё и компрессию комманд реализовывать кинуть ссылку на глан или сам найдёшь? спасибо, почитал про глан, интересный проект |