![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись в 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 и критические секции.