Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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;...", [....])));


А в обработчике WMSaveLog
writeln(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.49 MB
Время: 0.035 c
15-1169509631
Константинов
2007-01-23 02:47
2007.02.11
Интернет провайдер расскажите поподроднее :)


2-1169654886
NightRain
2007-01-24 19:08
2007.02.11
Как найти большее значение в двухмерном массиве?


6-1157972778
wezzz
2006-09-11 15:06
2007.02.11
Защита почтовых сообщений.


4-1159698620
AlexeyT
2006-10-01 14:30
2007.02.11
Вывод арабского текста (справа-налево)


2-1169557027
KyRo
2007-01-23 15:57
2007.02.11
Как отловить что виндовс завершает работу