![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
kas |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 16.6.2010 Пользователь №: 1813 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
здравствуйте! возникла проблема с QTcpSocket. Есть простой клиент, который читает блоками файл и отправляет его на сервер. Сервер: получает данные и записывает их на диск. И возникает такая проблема, что при приеме данных, в некоторый момент времени перестает посылаться сигнал readyRead. При этом данные в буфер сокета записываются и они доступны для чтения. Кто-нибудь сталкивался с такой проблемой? Подскажите в чем может быть причина. Заранее спасибо.
|
|
|
![]() |
ViGOur |
![]()
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
В коде.
Покажи код, его думаю немного должно быть... |
|
|
inviZ |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 5.6.2010 Пользователь №: 1781 Спасибо сказали: 4 раз(а) Репутация: ![]() ![]() ![]() |
kas, скорее всего в обработчике readyRead ты считываешь из буфера только одно сообщение. А буфер на самом деле может уже содержать несколько. Но лучше покажи код.
|
|
|
kas |
![]()
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 16.6.2010 Пользователь №: 1813 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
inviZ, спасибо всем за отклик. я уже нашел причину данного глюка.
|
|
|
ViGOur |
![]()
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Так опиши решение для следующих страждуших!
![]() |
|
|
Lemon |
![]()
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 15.3.2011 Пользователь №: 2505 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
черт...плохо, что топикстартер не описал решения.
Помогите решить идентичную проблему. Код потокового класса сервера:
Далее processingConnection
Теперь код клиента, а именно его readyRead связанный слот
А собственно проблема в том, что после подключения и отправки рез-та (out<<quint16(0)<<quint16(ResSUCCESS)) у сервера больше не сигналит readyRead(), больше ничего от клиента он не принимает. Подключал слот к stateChanged - состояние не меняется, стабильно = 3(соединение установлено) (qt 4.7.1 VS 2008) |
|
|
PAFOS |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Может быть не в этом проблема, но все равно у тебя баг:
void dbClientThread::run() { s=new QTcpSocket(this); .... у тебя родительский объект будет экземпляр dbClientThread, который создан в потоке А. а сам создаваемый объект будет находится в потоке Б В связи с этим сигналы от QTcpSocket будут обрабатываться в потоке А (или могут вообще до него не доходить, я точно не помню) Я делаю так: dbClientThread *thread = new dbClientThread(); thread->start(); thread->moveToThread(thread); // теперь все методы dbClientThread будут обрабатываться в потоке, который был создан в методе run(). т.е. теперь thread обрабатывает сам себя ну и в методе dbClientThread::run() при создании сокета не указывай родителя. |
|
|
Lemon |
![]()
Сообщение
#8
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 15.3.2011 Пользователь №: 2505 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Проблему решило
dbClientThread *thread = new dbClientThread(..., this); заменить на dbClientThread *thread = new dbClientThread(...); хотя преспокойно this стоит в примере threadfortune PAFOS большое спасибо за помощь и за исчерпывающее разьеснение ![]() |
|
|
PAFOS |
![]()
Сообщение
#9
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Ты уверен что приложение работает так как ты хочешь?))
Поставь в отладчике точку останова на методе void dbClientThread::run() и на void dbClientThread::incomingData() когда приложение брякнется, ты увидишь что в методе void dbClientThread::run() у тебя выполняется созданный поток а в методе void dbClientThread::incomingData() выполняется главный) Получается мнимая многопоточность, товарищ. Вот мини-проект с доказательствами)
Эскизы прикрепленных изображений
Прикрепленные файлы
|
|
|
Алексей1153 |
![]()
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
PAFOS, зачётный шрифт
![]() |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 28.5.2025, 12:25 |