Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
8-1091099262
WondeRu
2004-07-29 15:07
2004.12.05
DirectShow. Как воспроизвести сразу 2 видеокамеры?


1-1100882886
aliced
2004-11-19 19:48
2004.12.05
Incopatible types: String and Char


14-1099755652
ИМХО
2004-11-06 18:40
2004.12.05
Чемпионат Испании: турнир прогнозов


14-1100653019
Тохирбек
2004-11-17 03:56
2004.12.05
Друг


14-1100524967
Kolan
2004-11-15 16:22
2004.12.05
Помогите на вопрос ответить.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский