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

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

Запись в textfile


loword2 ©   (2007-01-26 17:59:00) 

Ситуация такая: Я использую некоторый компонент для работы с http протоколом (ICS -- THttpCli), который используется в виде массива этих компонентов. (th: array of THttpCli;) А обработчик событий один на всё это.
Ну так вот, мне необходимо, что-бы после некоторого разбора полученных данных, записать некоторые из них в textfile. Я пытался по разному сделать это, но т.к. процесс доступа к файлу происходит сразу по нескольким элементам из массива... то...

Я пытался проделать это двумя способами:
procedure TForm1.MyHttpCliRequestDone(Sender: TObject; RqType: THttpRequest; ErrCode: Word);
var
 f1: textfile;
begin
 (sender as THttpCli).SendStream.Free;
 (sender as THttpCli).SendStream := nil;
 if ErrCode <> 0 then begin
....

     assignfile(f1, savefile);
     {$i-}append(f1);{$i+}
     if IOResult <> 0  then rewrite(f1);
     writeln(f1, Format('%s;%s;', [....]));
     closefile(f1);
.....


procedure TForm1.MyHttpCliRequestDone(Sender: TObject; RqType: THttpRequest; ErrCode: Word);
var
 f1: textfile;
begin
 (sender as THttpCli).SendStream.Free;
 (sender as THttpCli).SendStream := nil;
 if ErrCode <> 0 then begin
....

   ResCrit.Enter;
   try
     assignfile(f1, savefile);
     try
       {$i-}append(f1);{$i+}
       if IOResult <> 0  then rewrite(f1);
       writeln(f1, Format('%s;%s;', [....]));
     finally
       closefile(f1);
     end;
   finally
     ResCrit.Leave;
   end;
.....


Но в любом случае, после некоторого времени стабильной работы, получаю I/O error. Что нужно сделать для корректной работы?


Германн   (2007-01-27 01:46:00) [1]

Хотя тут моя компетенция недостаточна :(
Посмотрел бегло исходники ICS.
Этот самый THttpCli оказывается создаёт своё окно. А тогда возможны варианты, учитывая то, что код в сабже явно сформирован именно для выкладки на форум. С купюрами, а может и не только с ними :(


Германн   (2007-01-27 00:21:00) [2]


> При передачи через TMessage нужно ли использовать в обработчике
> CriticalSection?
>

Не нужно. Но вот сейчас внимательно перечитал сабж и понял, что вообще собака порылась не тут.

> но т.к. процесс доступа к файлу происходит сразу по нескольким
> элементам из массива... то...
- Это чушь. Параллельная работа двух процедур типа твоей MyHttpCliRequestDone возможна толькоесли они выполняются в разных потоках, но никак не в одном и том же.


loword2   (2007-01-26 19:48:00) [3]

Я сделал так:
MyHttpCliRequestDone:
   SendMessage(Handle, WM_SaveLog, 0, integer(Format('%s;%s;...', [....])));


А в обработчике WMSaveLog
writeln(f1, PChar(Mes.lParam));

Но проблема осталась, проходит некоторое количество времени, всё записывается нормально, а потом вдруг I/O error и после снова продолжается. Что такое?

При передачи через TMessage нужно ли использовать в обработчике CriticalSection?


Германн   (2007-01-26 18:30:00) [4]

Например.
В главной форме приложения:
procedure WMSaveLog(var Mes: TMessage); message WM_SaveLog;
В TForm1.MyHttpCliRequestDone:
 SendMessage(MainForm.Handle,WM_SaveLog,что-то,что-то);


loword2   (2007-01-26 18:25:00) [5]


> Пусть с файлом работает кто-нибудь другой. А твои компоненты
> уже с ним.

Ничего не понял, может можно чуть с примером?


Германн   (2007-01-26 18:14:00) [6]

Пусть с файлом работает кто-нибудь другой. А твои компоненты уже с ним.


loword2   (2007-01-26 18:11:00) [7]

Именно без нитей, ибо THttpCli, заточен работать спкойно и без использования Threads. Просто их массив. (компонентов)


unknown   (2007-01-26 18:07:00) [8]


> Что нужно сделать для корректной работы?

Несколько нитей? Использовать TFileStream и критические секции.


Наверх

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