![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правельно работатать с indy [D7, XP]
Costia © (2008-02-08 17:56:00)Уважаемые мастера помогите решить проблему так как самостоятельно не получается .
две программы общающиеся между собой по средствам компонента indy сервер работает на PDA, клиент на PC /
на PDA архитектура процессора arm операционка на платформе WinCe/ програмлю на Lazarus и использую версию компонента 10.2.0.1
Автор: Chad Z. Hower (Kudzu) and the Indy Pit Crew - http://www.indyproject.org/
############# использую вот такой код : #############################################
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
i:integer;
begin
if acontext.Connection.IOHandler.Readable then
readmessage.Add(acontext.Connection.IOHandler.ReadLn);
i:=0;
while i < sendmessage.count do
begin
acontext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
sendmessage.Delete(0);
i:=i+1;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i,i2:integer;
begin
i:=0;
while i
Slym (2008-02-11 06:28:00) [1]1. Потоко небезопасный доступ к спискам команд (sendmessage/readmessage)... решение: критические секции (TCriticalSection)
2. Порядок команд нарушается изза - Отправки в несколько соединений... спросишь - ОТКУДА? оттуда - из dTCPServer1Execute не должен выходить пока не порвется соединение, а ты прочитал, отправил и вышел... соединение рвется - если делается повторная отправка то уже на другом соединении... Решение: использовать 1 соединение, либо проверять его единичность в один момент времени.
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
while AContext.Connection.Connected do
begin
if AContext.Connection.IOHandler.Readable then
begin
Lock;
try
readmessage.Add(acontext.Connection.IOHandler.ReadLn);
finally
Unlock;
end;
end;
while sendmessage.count>0 do
begin
Lock;
try
AContext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
sendmessage.Delete(0);
finally
Unlock;
end;
end;
end;
end;
Costia (2008-02-08 18:37:00) [2]тоесть компонент для Lazarus
Costia (2008-02-08 18:36:00) [3]а это есть компонент для инди
procedure TIdUDPListenerThread.Run;
var
PeerIP: string;
PeerPort : TIdPort;
ByteCount: Integer;
begin
if FBinding.Select(AcceptWait) then try
// Doublecheck to see if we've been stopped
// Depending on timing - may not reach here if it is in ancestor run when thread is stopped
if not Stopped then begin
SetLength(FBuffer, FServer.BufferSize);
ByteCount := GStack.ReceiveFrom(FBinding.Handle, FBuffer, PeerIP, PeerPort, FBinding.IPVersion);
SetLength(FBuffer, ByteCount);
FBinding.SetPeer(PeerIP, PeerPort, FBinding.IPVersion);
if FServer.ThreadedEvent then begin
UDPRead;
end else begin
Synchronize(UDPRead);
end;
end;
except
// exceptions should be ignored so that other clients can be served in case of a DOS attack
on E : Exception do
begin
FCurrentException := E.Message;
FCurrentExceptionClass := E.ClassType;
if FServer.ThreadedEvent then begin
UDPException;
end else begin
Synchronize(UDPException);
end;
end;
end;
end;
Costia (2008-02-08 18:22:00) [4]sniknik
спасиб за наводку но я навечек и струдом понимаю к чему вы там пришли .
можеш подсказать что именно надо изменить а точнее где в компоненте надо исправить ошибку и как это делается .
sniknik (2008-02-08 18:06:00) [5]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1189799328&n=4
Costia (2008-02-08 18:04:00) [6]да и забыл сказать . можно былобы конечно это проигнорировать , все ровно этот панковский код работает но дело в том что проблемма прогресирует и после 30 команд эфекта надо ждать по 5 сек