Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизИспользование мьютексов Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c