Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запись в файл из потоков


Автор: Pararam 8.2.2008, 22:28
Здравствуйте!
Есть 10 потоков, они обрабатывают 10 файлов и сохроняют полученный результат в 1 файл!
Но когда несколько потоков одновременно записывают данные в файл то выскакивает ошибка I/O
Надо как то синхронизировать запись в файл, чтоб ошибка не вылетала!


Процедура записи в файл!

Код

Procedure SaveLog(Line:string);
var
file_str: Text;
FileNameF:string;
res:integer;
Begin
FileNameF:='c:\status.txt';
if FileExists(FileNameF) then
Begin
Assign(file_str,FileNameF);
Append(file_str);
Writeln(file_str,Line);
CloseFile(file_str);
end
else
Begin
Assign(file_str,FileNameF);
ReWrite(file_str);
Writeln(file_str,Line);
CloseFile(file_str);
end;




Пробовал вот так! Сильно нагружает процессор, а бывает и повисает вовсе!

Код

function ApplicationUse(fName: string): boolean;
var
  HFileRes: HFILE;
begin
  Result := false;
  if not FileExists(fName) then exit;
  HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then CloseHandle(HFileRes);
end;


Код

Procedure SaveLog(Line:string);
var
file_str: Text;
FileNameF:string;
res:integer;
Begin
FileNameF:='c:\status.txt';

while ApplicationUse(FileNameF)=true do
Begin
//Ждём!
end;

if FileExists(FileNameF) then
Begin
Assign(file_str,FileNameF);
Append(file_str);
Writeln(file_str,Line);
CloseFile(file_str);
end
else
Begin
Assign(file_str,FileNameF);
ReWrite(file_str);
Writeln(file_str,Line);
CloseFile(file_str);
end;



Помогите пожалуйсто!

Автор: MetalFan 9.2.2008, 00:02
используй критическую секцию например:
Код

...
uses SyncObj;
...
  TXXX = class(...)
...
    FCS: TCtriticalSection;
...
  end;
...
  constructor TXXX.Create;
  begin
    ...
    FCS :=  TCriticalSection.Create;
    ...
  end;
  procedure TXXX.Write( .... );
  begin
     FCS.Enter;
     ...
     FCS.Leave;
   end;

  destructor TXXX.Create; override;
  begin
    ...
    FCS.Free;
    ...
  end;


Автор: Pararam 9.2.2008, 00:11
[Fatal Error] Unit1.pas(11): File not found: 'SyncObj.dcu'

uses SyncObj;

Нема такого уменя! Где взять?!

Автор: Qu1nt 9.2.2008, 00:19
Просто ошибся - SyncObjs.

Автор: Pararam 9.2.2008, 00:35
Qu1nt, 


Да, да .... я разобрался с TCtriticalSection


Вроде начало работать...... работает секунд 20 а потом вылетает куча ошибок !!!

Правдо для всех потоков 1 критическая секция!

Нужно для каждого делать TCtriticalSection?

Автор: Qu1nt 9.2.2008, 00:40
http://forum.vingrad.ru/forum/topic-60076.html!

Автор: Pararam 9.2.2008, 00:46
Вроде стала работать!

Но выдаёт ошибку!

http://ipicture.ru/

Автор: Alexeis 11.2.2008, 10:31
Pararam, это самая универсальная ошибка, может из-за чего хош возникать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)