Главная страница
    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.46 MB
Время: 0.044 c
1-1100767528
Jay
2004-11-18 11:45
2004.12.05
Windows Fonts


14-1100797528
Sanek_Metaller
2004-11-18 20:05
2004.12.05
Задачка


8-1094407602
IRYS
2004-09-05 22:06
2004.12.05
Preview mode для ScreenSaver a


4-1098463382
Cheburek
2004-10-22 20:43
2004.12.05
Drag & Drop имён файлов из моего приложения в проводник?


1-1101114261
denis24
2004-11-22 12:04
2004.12.05
Несколько image в scrollbox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский