![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с IndyUDPServer в потоке Thread [D7, WinXP]
XfroSt © (2006-12-21 16:31:00)Ситуация такая... я работаю с IndyUDPServer в потоке...
метод execute описан так
procedure TGameThread.Execute;
begin
inherited;
UdpS := TidUDPServer.Create(nil);
ScanGame;
Sleep(2000); // ожидаем 2 секунды (сделать настройку) для ответа UDP
UdpS.Destroy; // уничтожаем сервер
TGameThread(ThreadList[ThreadList.Count - 1]).Terminate; // убираем один поток из списка
ThreadList.Delete(ThreadList.Count - 1);
end;
процедура ScanGame выглядит так
begin
// Если UDp
UdpS.Active := false;
Udps.OnUDPRead := UdpsUDPRead;
UdpS.DefaultPort :=Cport ;
UdpS.BroadcastEnabled := true;
Udps.ThreadedEvent := true;
UdpS.Active := true;
UdpS.Broadcast(pak,Sport);
end;
при это как видно поток живет 2 секунды, сервер переходит в ожидание и отсылает запрос. Если приходит ответ в течении 2 секунд, то он обрабатывается если нет , то сервер и поток уничтожаются.
Данный поток из основной программы я вызываю вот так
ThreadList.Add(TGameThread.Create(false));
Проблема при вызове двух потоков одновременно (они отсылают разные запросы), когда второй поток делает вот это
UdpS.Broadcast(pak,Sport)
, а прервый еще не уничтожился, возникает ошибка Counot bind the socket.
Вопрос!
Как можно организовать работу нескольких потоков IndyUDPServer что бы не возникало такой ошибки ? как я понял просто второй занимает тот же сокет, как ему дать другой. Что бы можно было многопоточно отсылать сообщения и ждать их ответов ?
XfroSt (2006-12-22 20:47:00) [1]Сергей М Спасибо!
Я решил по другому... -- UdpS.Binding -- все работает ....
Сергей М. (2006-12-22 08:43:00) [2]И зачем тебе куча доп.потоков - это тоже не понятно.
Достаточно одного. Да и он не нужен - при ThreadedEvent = true всё это с успехом делается в осн.потоке.
Сергей М. (2006-12-22 08:20:00) [3]
> а это назначается порт отправки или порт приема ?
Порт приема.
> поток живет 2 секунды, сервер переходит в ожидание и отсылает
> запрос
Судя по твоему коду дело обстоит так
1. Сервер активируется.
2. Выполняет бродкаст на указанный параметром порт.
3. Поток спит 2 секунды богатырским сном, ничего не делая и ни на что не реагируя при этом.
4. Поток просыпается, уничтожает сервер и тут же завершает свое выполнение.
XfroSt (2006-12-21 16:52:00) [4]
> UDPServer.Binding.Port := даю_другойА вообще - каша какая-
> то из обрывочных сведений о многом понемногу.
а это назначается порт отправки или порт приема ?
какие сведения еще сообщить ? вроде я описал все пошагово...
Сергей М. (2006-12-21 16:35:00) [5]
> как ему дать другой
UDPServer.Binding.Port := даю_другой
А вообще - каша какая-то из обрывочных сведений о многом понемногу.