Главная страница
    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.03 c
9-1090574993
Megabyte-CeerCop
2004-07-23 13:29
2004.12.05
Игра готова


1-1101052041
lamerokvdelphi
2004-11-21 18:47
2004.12.05
Для чего нужен Sleep?


1-1101141368
Chery
2004-11-22 19:36
2004.12.05
Как отключить всех пользователей кроме себя от сервера прилож.?


3-1100014825
Hitman
2004-11-09 18:40
2004.12.05
Database not assigned


1-1100775754
SmikE
2004-11-18 14:02
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский