Вниз
Скачать: CL | DM;

работа с IndyUDPServer в потоке Thread   Найти похожие ветки 

 
XfroSt   (2006-12-21 16:31) [0]

Ситуация такая... я работаю с 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 что бы не возникало такой ошибки ? как я понял просто второй занимает тот же сокет, как ему дать другой. Что бы можно было многопоточно отсылать сообщения и ждать их ответов ?


 
Сергей М. ©   (2006-12-21 16:35) [1]


> как ему дать другой


UDPServer.Binding.Port := даю_другой

А вообще - каша какая-то из обрывочных сведений о многом понемногу.


 
XfroSt   (2006-12-21 16:52) [2]


> UDPServer.Binding.Port := даю_другойА вообще - каша какая-
> то из обрывочных сведений о многом понемногу.

а это назначается порт отправки или порт приема ?

какие сведения еще сообщить ? вроде я описал все пошагово...


 
Сергей М. ©   (2006-12-22 08:20) [3]


> а это назначается порт отправки или порт приема ?


Порт приема.


> поток живет 2 секунды, сервер переходит в ожидание и отсылает
> запрос


Судя по твоему коду дело обстоит так

1. Сервер активируется.
2. Выполняет бродкаст на указанный параметром порт.
3. Поток спит 2 секунды богатырским сном, ничего не делая и ни на что не реагируя при этом.
4. Поток просыпается, уничтожает сервер и тут же завершает свое выполнение.


 
Сергей М. ©   (2006-12-22 08:43) [4]

И зачем тебе куча доп.потоков - это тоже не понятно.

Достаточно одного. Да и он не нужен - при ThreadedEvent = true всё это с успехом делается в осн.потоке.


 
XfroSt   (2006-12-22 20:47) [5]

Сергей М Спасибо!
Я решил по другому... -- UdpS.Binding -- все работает ....



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.013 c
6-1166624594
n_shadow
2006-12-20 17:23
2007.07.29
Заполнение структуры PHostEnt


2-1183511741
Voproshay
2007-07-04 05:15
2007.07.29
Как работать с длительными процессами в программе?


15-1183523848
шпыён
2007-07-04 08:37
2007.07.29
Вопрос к тем кто в Америке, Зап. Европе и пр.


15-1182871267
oldman
2007-06-26 19:21
2007.07.29
Ну... поскольку недавно сбрил бороду и усы...


2-1183491972
Ivolg
2007-07-03 23:46
2007.07.29
Использование без TMemoryStream




   Наверх