Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

Запись в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.042 c
4-1159453855
Dib@zol
2006-09-28 18:30
2007.02.11
Глюк с перерисовкой окна


2-1169473545
hgd
2007-01-22 16:45
2007.02.11
Вопрос по RGB


4-1159525169
RoadStar
2006-09-29 14:19
2007.02.11
Получение данных об оперативной памяти


15-1168870805
oxffff
2007-01-15 17:20
2007.02.11
Взгляд на С++ с другой стороны.


15-1169373734
Expell
2007-01-21 13:02
2007.02.11
В чем причина?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский