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

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

Ведение лога в многопоточном приложении


Страницы:   1 2 3

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 использовать критические секции


Страницы:   1 2 3

Наверх

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