Главная страница
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.04 c
4-1098259395
snake1977
2004-10-20 12:03
2004.12.05
Версия файла


8-1094480779
hamster
2004-09-06 18:26
2004.12.05
Копирование файлов


9-1090574993
Megabyte-CeerCop
2004-07-23 13:29
2004.12.05
Игра готова


11-1073945866
Юрий Ж.
2004-01-13 01:17
2004.12.05
HotKeyEdit?


1-1101055684
Верный вопрос
2004-11-21 19:48
2004.12.05
Какой функцией "подождать" пока отработает код?