Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл из потоков, Запись в 1 файл из потоков 
:(
    Опции темы
Pararam
Дата 8.2.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Здравствуйте!
Есть 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;



Помогите пожалуйсто!
PM MAIL   Вверх
MetalFan
Дата 9.2.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



используй критическую секцию например:
Код

...
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;



Это сообщение отредактировал(а) MetalFan - 9.2.2008, 00:02


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Pararam
Дата 9.2.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



[Fatal Error] Unit1.pas(11): File not found: 'SyncObj.dcu'

uses SyncObj;

Нема такого уменя! Где взять?!
PM MAIL   Вверх
Qu1nt
Дата 9.2.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Просто ошибся - SyncObjs.
PM MAIL   Вверх
Pararam
Дата 9.2.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Qu1nt, 


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


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

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

Нужно для каждого делать TCtriticalSection?
PM MAIL   Вверх
Qu1nt
Дата 9.2.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



PM MAIL   Вверх
Pararam
Дата 9.2.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Вроде стала работать!

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

user posted image

Это сообщение отредактировал(а) Pararam - 9.2.2008, 00:54
PM MAIL   Вверх
Alexeis
Дата 11.2.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.