![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование мьютексов [D7, WinXP]
navyk © (2004-10-23 10:51:00)Есть первая программа, которая должна через некоторые промежутки времени записывать данные в файл, и есть вторая программа, которая должна через такой же промежуток времени считывать данные из этого файла. Проблема в том, что вторая программа выдает ошибку чтения из файла, занятого другим процессом. Вроде бы эта проблема решается с помощью мьютексов, но я не соображу, как их правильно использовать?
Polevi (2004-10-24 09:17:00) [1]угу, еще код отформатировать и вообще будет красота :)
GuAV (2004-10-23 18:22:00) [2]ИМХО так
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-23 17:34:00) [3]>DrPass © (23.10.04 13:20) [4]
бред
>GuAV © (23.10.04 13:21) [5]
ты прав, ошибся я
GuAV (2004-10-23 13:21:00) [4]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.
?
DrPass (2004-10-23 13:20:00) [5]
> А почему бы не открывать файл с монопольным доступом
Зачем монопольный доступ? Открытый файл в ХР - такой же объект ядра, как и мютекс. И по идее программа вполне может ждать завершения цикла записи/чтения с помощью WaitForSingleObject по его дескриптору
Polevi (2004-10-23 12:04:00) [6]>tesseract (23.10.04 11:58) [2]
вернет, твои действия ?
tesseract (2004-10-23 11:58:00) [7]А почему бы не открывать файл с монопольным доступом - Createfile вернёт ошибку доступа
Polevi (2004-10-23 11:54:00) [8]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;
сколько бы процессов не было запущено с данным кодом, только один будет иметь монопольный доступ к ресурсу