![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ведение лога в многопоточном приложении
Cooller © (2007-02-20 22:52:00)Есть серверное приложение, активно работающая одновременно с несколькими клиентами. Некоторые события необходимо выводить в лог (как в файл, так и в RichEdit).
Вот сама процедура:
procedure ATL(msg:string; showmsg:boolean=false);
begin
try
Append(F);
WriteLn(F,DateTimeToStr(now)+': '+msg);
CloseFile(F);
except
end;
end;
FormCreate:
AssignFile(F,opt.curlogname);
{$I-}
Append(F);
{$I+}
If IOResult<>0 then Rewrite(F);
CloseFile(F);
В RichEdit добавляю просто с помощью Lines.Add
Так вот, несмотря на то, что у меня во всех процедурах и функциях стоят оработчики try except end, с выводом сообщения об ошибке в лог, периодически получаю 'Access Violation'. Может быть проблема и не в добавлении в лог, но сейчас пересматриваю весь код и возникла мысль, что коллизии могут возникать и в этом месте.
Подскажите как правильно организовать вывод информации?
Cooller (2007-02-20 23:19:00) [41]
> Только через Synchronize
У меня:
socks:array of record
s:TClientSocket;
...
end;
Инициализация:
for i:=0 to length(socks)-1 do
begin
socks[i].s:=TClientSocket.Create(nil);
with socks[i].s do
begin
...
onRead:=SockRead;
onDisconnect:=SockDisconnect;
onError:=SockError;
end;
end;
procedure TfrmMain.SockRead(Sender: TObject; Socket: TCustomWinSocket);
begin
try
...
ATL('example');
...
except
SEM('SockRead');
end;
end;
DrPass (2007-02-20 22:55:00) [42]
> В RichEdit добавляю просто с помощью Lines.Add
Только через Synchronize
> try
> Append(F);
> WriteLn(F,DateTimeToStr(now)+': '+msg);
> CloseFile(F);
> except
> end;
А здесь - вместо try...except использовать критические секции