Текущий архив: 2007.02.11;
Скачать: CL | DM;
ВнизЗапись в textfile Найти похожие ветки
← →
loword2 (2007-01-26 17:59) [0]Ситуация такая: Я использую некоторый компонент для работы с 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. Что нужно сделать для корректной работы?
← →
unknown © (2007-01-26 18:07) [1]
> Что нужно сделать для корректной работы?
Несколько нитей? Использовать TFileStream и критические секции.
← →
loword2 (2007-01-26 18:11) [2]Именно без нитей, ибо THttpCli, заточен работать спкойно и без использования Threads. Просто их массив. (компонентов)
← →
Германн © (2007-01-26 18:14) [3]Пусть с файлом работает кто-нибудь другой. А твои компоненты уже с ним.
← →
loword2 (2007-01-26 18:25) [4]
> Пусть с файлом работает кто-нибудь другой. А твои компоненты
> уже с ним.
Ничего не понял, может можно чуть с примером?
← →
Германн © (2007-01-26 18:30) [5]Например.
В главной форме приложения:procedure WMSaveLog(var Mes: TMessage); message WM_SaveLog;
В TForm1.MyHttpCliRequestDone:
SendMessage(MainForm.Handle,WM_SaveLog,что-то,что-то);
← →
loword2 (2007-01-26 19:48) [6]Я сделал так:
MyHttpCliRequestDone:
SendMessage(Handle, WM_SaveLog, 0, integer(Format("%s;%s;...", [....])));
А в обработчике WMSaveLogwriteln(f1, PChar(Mes.lParam));
Но проблема осталась, проходит некоторое количество времени, всё записывается нормально, а потом вдруг I/O error и после снова продолжается. Что такое?
При передачи через TMessage нужно ли использовать в обработчике CriticalSection?
← →
Германн © (2007-01-27 00:21) [7]
> При передачи через TMessage нужно ли использовать в обработчике
> CriticalSection?
>
Не нужно. Но вот сейчас внимательно перечитал сабж и понял, что вообще собака порылась не тут.
> но т.к. процесс доступа к файлу происходит сразу по нескольким
> элементам из массива... то...
- Это чушь. Параллельная работа двух процедур типа твоей MyHttpCliRequestDone возможна только если они выполняются в разных потоках, но никак не в одном и том же.
← →
Германн © (2007-01-27 01:46) [8]Хотя тут моя компетенция недостаточна :(
Посмотрел бегло исходники ICS.
Этот самый THttpCli оказывается создаёт своё окно. А тогда возможны варианты, учитывая то, что код в сабже явно сформирован именно для выкладки на форум. С купюрами, а может и не только с ними :(
Страницы: 1 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.043 c