Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Виснет программа! CriticalSection или ?


Страницы:   1 2

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.

> Критических секций в потоке нету, так как они внутри класса
> перекрывают все!

То, что в одном потоке уже есть критические секции вовсе не означает, что в другом потоке их не должно быть. Точнее - означают как раз обратное.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо