Russian Qt Forum

Qt => Работа с сетью => Тема начата: Steven_Orko от Апрель 13, 2007, 10:58



Название: [Qt 3.3.x] Многопоточный сервер на основе QServerSocket
Отправлено: Steven_Orko от Апрель 13, 2007, 10:58
По ТЗ необходимо реализовать многопоточный сетевой сервер  по протоколу TCP. Суть сервера заключается в следующем. Имеется некая структура данных, содержимое которой могут запрашиваться и изменяться только на основе сетевых запросов. Если бы это были данные, которые напрямую изменялись в соответсвие с сетевым запросом, то проблемы не было бы. Но дело в том, что после некоторого сетевого запроса сервер выполняет действие, в результате которого может быть сгенерирован сигнал и вызван, соответственно, слот. Проблемма в том, что мютексы ни как не помогают. На вызове слота, или на генерировании сигнала программа падает в кору.
Как я понял, сигнал генерируется в callback функции в основном потоке. Если я прав, то в чем может быть проблема? Поделитесь опытом, кто уже реализовывал подобную штуку. При необходимости могу поделиться кодом, но он занимает без малого 2000 строк...

добавлено спустя 1 час 32 минуты:

 Почитал Assistant повнимательнее. Оказывается, что класс объект класса QSocket нельзя использовать в потоках. Для использования в потоках необходимо использовать объект класса QSocketDevice.


Название: [Qt 3.3.x] Многопоточный сервер на основе QServerSocket
Отправлено: Sergeich от Апрель 13, 2007, 11:11
А какая модель сервера? Нитка на запрос или нитка на соединение?
Цитировать
Оказывается, что класс объект класса QSocket нельзя использовать в потоках.
В 3-ке в нитках почти ниче кутевого нельзя юзать :(


Название: [Qt 3.3.x] Многопоточный сервер на основе QServerSocket
Отправлено: Hordi от Апрель 13, 2007, 11:50
2 Sergeich:
>В 3-ке в нитках почти ниче кутевого нельзя юзать

Можно, только не напрямую, а через отправку сообщений.


Название: [Qt 3.3.x] Многопоточный сервер на основе QServerSocket
Отправлено: Steven_Orko от Апрель 13, 2007, 20:49
На самом деле можно. )))) Я даже базовый класс для многопоточного  сервера TCP написал. Там используется не QSocket, а QSocketDevice. Все оказалось достаточно просто. Код не кроссплатформенный, но мне оно и не надо. ))) Если надо, выложу в понедельник, как его оттесту и проверю на кроликах. )))

2 Sergeich: В принципе, ты прав )))) Но того, что можно, вполне хватает при правильной компоновке )))

2 Hordi:
Можно и без нее, используя специальный алгоритм блокировки )))

В общем, в итоге у меня получилось нечто, напоминающее QThread Qt series 4. ))))


Название: [Qt 3.3.x] Многопоточный сервер на основе QServerSocket
Отправлено: Hordi от Апрель 16, 2007, 11:09
Дело в том, что с сообщениями не нужно заморачиваться с блокировками вообще... Отправил и забыл.

добавлено спустя 53 секунды:

 Я раньше также блокировки юзал, но затем все переделал на сообщения, имхо проще.