![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Виснет программа! CriticalSection или ?
Miralex © (2005-01-18 11:54:00)Мастера помогите разобраться почему моя программа зависает.
Использую я свой класс в программе. В классе я перекрываю критическими секциями все места, где возможно выполение из потока! В итоге почемуто моя программа виснет. Помогите разобраться.
Кусочек кода, на который я грешу:
procedure TCharacter.GameSendSHex(SHex : String; Encrypt : boolean);
var I, Len: Integer;
BufIn, BufOut : PArray;
begin
SocketSection.Enter;
if not GameClient.Active then
begin
SocketSection.Leave;
Exit;
end;
New(BufIn);
New(BufOut);
Len := Length(SHex);
{Конвертируем SHex в Array of byte}
if (Len = 0) or (Len mod 2 <> 0) then
begin
AddtoDebugMemo('Error converting SHex to Array of byte');
SocketSection.Leave;
Exit;
end;
for I := 0 to ((Len div 2)-1) do BufIn^[I] := StrToInt('$'+Copy(SHex, I*2+1, 2));
Len := Len div 2;
{Криптуем методом BlowFishCrypt если Encrypt=true и EncryptMetod=2}
if Encrypt and (EncryptMetod = 2) then BlowfishEncrypt(BlowfishCryptObj,BufIn,BufOut,Len)
else for i := Low(BufOut^) to High(BufOut^) do BufOut^[i]:=BufIn^[i];
{Пытаемся отослать байтики серверу}
if GameClient.Socket.Connected then
begin
try
GameClient.Socket.SendBuf(BufOut^,Len);
AddtoDebugMemo('Client send '+inttostr(Len)+' bytes: '+SHex);
except
AddtoDebugMemo('Error in Socket.SendBuf');
end;
end
else AddtoDebugMemo('You try send some bytes, but Character is not Connected');
SocketSection.Leave;
Dispose(BufIn);
Dispose(BufOut);
end; {End TCharacter.GameSendSHex}
procedure TCharacter.SendUnicodeText(Value : String);
var i : Integer;
S,SHex : String;
begin
S := Value;
{Если в S пусто то выходим}
if Length(S)=0 then Exit;
{в S - то что мы хотим сказать серверу}
SHex := '';
{Дописываем в конец 2 нуля}
SHex := '0000';
{Вставляем текст в формате '00' буква '00' буква и тд}
for i:=Length(s) downto 1 do SHex := '00' + IntToHex(ord(S[i]),2) + SHex;
{Добавляем в начало язык (4 байта)}
{Покачто только русский RUS='52 55 53'}
SHex := '52555300'+SHex;
{Добавляем тип(1 байт), цвет(2 байта) и шрифт(2 байта)}
SHex := '0002B20003'+SHex;
{Длина пакета}
SHex := IntToHex((Length(SHex) div 2)+3,4) + SHex;
SHex := 'AD' + SHex;
GameSendSHex(SHex,true);
end;
Из потока я вызываю так:
TCharacter(Char).SendUnicodeText(S);
Критических секций в потоке нету, так как они внутри класса перекрывают все! Насколько я понял так можно их использовать. Или нет?
В итоге программа зависает на N-ом использовании TCharacter(Char).SendUnicodeText(S) из потока.
Думал что гдето зацикливаються критические секции - поубирал все что неиспользую в данный момент. Всеравно виснет.
Мастера, подскажите пожалуйста где ошибка?
Miralex (2005-01-18 12:23:00) [21]Да но по сути метод Synchronize достаточно медленнее чем CriticalSection.
> ИМХО, тут гораздо лучше использовать Synchronize.
Почему лучше?
TUser (2005-01-18 12:14:00) [22]ИМХО, тут гораздо лучше использовать Synchronize.
> Критических секций в потоке нету, так как они внутри класса
> перекрывают все!
То, что в одном потоке уже есть критические секции вовсе не означает, что в другом потоке их не должно быть. Точнее - означают как раз обратное.