Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Использование мьютексов   Найти похожие ветки 

 
navyk   (2004-10-23 10:51) [0]

Есть первая программа, которая должна через некоторые промежутки времени записывать данные в файл, и есть вторая программа, которая должна через такой же промежуток времени считывать данные из этого файла. Проблема в том, что вторая программа выдает ошибку чтения из файла, занятого другим процессом. Вроде бы эта проблема решается с помощью мьютексов, но я не соображу, как их правильно использовать?


 
Polevi ©   (2004-10-23 11:54) [1]

procedure TForm1.FormCreate(Sender: TObject);
begin
 z:=CreateMutex(nil,false,"1234Mutex"); пытаемся создать именованный мьютекс
 if z=0 then //он уже создан другим процессом, открываем его
 //тут надо анализировать GetLastError
   z:=OpenMutex(MUTEX_ALL_ACCESS,false,"1234Mutex");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 WaitForSingleObject(z,INFINITE); //пытаемся захватить ресурс
 ShowMessage("bla-bla"); //монопольно работаем с ресурсом
 ReleaseMutex(z); //освобождаем ресурс
end;

сколько бы процессов не было запущено с данным кодом, только один будет иметь монопольный доступ к ресурсу


 
tesseract   (2004-10-23 11:58) [2]

А почему бы не открывать файл с монопольным доступом - Createfile вернёт ошибку доступа


 
Polevi ©   (2004-10-23 12:04) [3]

>tesseract   (23.10.04 11:58) [2]
вернет, твои действия ?


 
DrPass ©   (2004-10-23 13:20) [4]


> А почему бы не открывать файл с монопольным доступом

Зачем монопольный доступ? Открытый файл в ХР - такой же объект ядра, как и мютекс. И по идее программа вполне может ждать завершения цикла записи/чтения с помощью WaitForSingleObject по его дескриптору


 
GuAV ©   (2004-10-23 13:21) [5]

Polevi ©   (23.10.04 11:54) [1]
if z=0 then //он уже создан другим процессом, открываем его


Или я ничего не понимаю или ошибка шибочка. Смотрю MSDN:

Return Values
If the function succeeds, the return value is a handle to the mutex object. If the named mutex object existed before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS. Otherwise, the caller created the mutex.

?


 
Polevi ©   (2004-10-23 17:34) [6]

>DrPass ©   (23.10.04 13:20) [4]
бред

>GuAV ©   (23.10.04 13:21) [5]
ты прав, ошибся я


 
GuAV ©   (2004-10-23 18:22) [7]

ИМХО так

procedure TForm1.FormCreate(Sender: TObject);
begin
z:=CreateMutex(nil,false,"1234Mutex");
if z=0 then RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if WaitForSingleObject(z,INFINITE) = WAIT_OBJECT_0 then //пытаемся захватить ресурс
try
  ShowMessage("bla-bla"); //монопольно работаем с ресурсом
finally
  ReleaseMutex(z); //освобождаем ресурс
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(z);
end;


 
Polevi ©   (2004-10-24 09:17) [8]

угу, еще код отформатировать и вообще будет красота :)



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
4-1098606535
Ashle
2004-10-24 12:28
2004.12.05
Как перезапустить сессию Application ? сэмулировать перезапуск


1-1101044563
ИМХО
2004-11-21 16:42
2004.12.05
Работая с текстовым файлом


1-1101306761
makingoff
2004-11-24 17:32
2004.12.05
открытие проги из списка "открыть с помощью"


1-1100685529
Lola
2004-11-17 12:58
2004.12.05
Вывести список файлов из папки, в имени которой есть побел


4-1098470876
MORA
2004-10-22 22:47
2004.12.05
Системная служба