Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

Как дождаться уничтожения MUTEXa   Найти похожие ветки 

 
Stanislav ©   (2005-04-21 12:10) [0]

Делаю так:
По таймеру выполняю сл. процедуру. см. ниже.
Но если Мютекса небыло все ок.
А если был, то после закрытия создавшего его приложения все равно не выполняется условие.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
HMutex:=CREATEMUTEX (nil,false,"SS_Mutex_ForUpdate");
if (getLastError<>ERROR_ALREADY_EXISTS) then
begin
...
...
end;

end;


 
Eraser ©   (2005-04-21 12:17) [1]

Stanislav ©

Зачем таймер???
Я же написал как надо...
http://delphimaster.net/view/4-1113930130/


 
Digitman ©   (2005-04-21 12:21) [2]


> А если был, то после закрытия создавшего его приложения
> все равно не выполняется условие


раз не выполняется, значит на сей момент мьютекс ALREADY_EXISTS


 
Eraser ©   (2005-04-21 12:24) [3]

Stanislav ©

Тем более в твоём примере таймер не отключается... так что ты хочешь тогда...


 
Stanislav ©   (2005-04-21 12:26) [4]

Eraser ©   (21.04.05 12:17) [1]
У меня немного не так
Запускается одна программа и создает Mutex,
Потом запускается другая, которая должна проверять если есть Mutex, то ничего не делать, а как Mutex пропал, то выполнить определенные действия и закрыться.


 
Stanislav ©   (2005-04-21 12:28) [5]

Eraser ©   (21.04.05 12:24) [3]

if (getLastError<>ERROR_ALREADY_EXISTS) then
begin
...
...
Application.terminate;
end;


 
Eraser ©   (2005-04-21 12:30) [6]

Stanislav ©

Так та другая программа (которая выполняет определённые действия) если нет мьютекса, создаёт его и потом проверяет сама себя.

Для этих целей тебе нужна ф-я OpenMutex.


 
Eraser ©   (2005-04-21 12:32) [7]

Eraser ©

Не так выразился! Создаёт мьютекс при проверке программа, которая проверяет. Короче при ТАКОЙ проверке этот самый мьютекс и создаётся.


 
Stanislav ©   (2005-04-21 13:15) [8]

Сделал OpenMutex все равно не работает.
HMutex:=OPenmutex(MUTEX_ALL_ACCESS ,false,"SS_Mutex_ForUpdate");
ShowMessage (IntToStr (HMutex));
if HMutex=0 then
begin
...
  Application.Terminate;
end;


 
Eraser ©   (2005-04-21 13:21) [9]

Stanislav ©

А куда таймер то делся?
Что ты ХОЧЕШЬ проверить данной строкой
if HMutex=0 then


 
alpet ©   (2005-04-21 13:27) [10]

У тебя в первой программе сам Mutex закрывается (CloseHandle)?

Вообще для этой задачи лучше использовать WaitForSingleObject (hProcess, 100) <> WAIT_TIMEOUT в таймере


 
Stanislav ©   (2005-04-21 13:29) [11]

Eraser ©   (21.04.05 13:21) [9]
Таймер остался, просто я кусок кода достал.
А строкой хочу проверить если 0 значит Mutexа нет.
Я в принципе решил проблему, ищу окно, все работает, но хотелось бы узнать почему не получается с Mutex"ом.


 
Eraser ©   (2005-04-21 13:32) [12]

alpet ©
Ядру известно, сколько процессов использует конкретный объект ядра, посколь ку в каждом объекте есть счетчик числа его пользователей. Этот счетчик — один из элементов данных, общих для всех типов объектов ядра. В момент создания объекта счетчику присваивается 1. Когда к существующему объекту ядра обращается другой процесс, счетчик увеличивается на 1. А когда какой-то процесс завершается, счетчики всех используемых им объектов ядра автоматически уменьшаются на 1. Как только счетчик какого-либо объекта обнуляется, ядро уничтожает этот объект.
  Рихтер.

Зачем закрывать мьютекс?


 
Eraser ©   (2005-04-21 13:34) [13]

Stanislav ©
Я в принципе решил проблему, ищу окно, все работает


До поры до времени....

почему не получается с Mutex"ом

Так ЧТО конкретно не получается?


 
alpet ©   (2005-04-21 13:39) [14]

>Зачем закрывать мьютекс?
Ну да, забыл - все что не освобождаешь сам - освободит система. Я просто к таким правилам стараюсь не привыкать.


 
alpet ©   (2005-04-21 13:39) [15]

>Зачем закрывать мьютекс?
Ну да, забыл - все что не освобождаешь сам - освободит система. Я просто к таким правилам стараюсь не привыкать.


 
Stanislav ©   (2005-04-21 13:41) [16]

Eraser ©   (21.04.05 13:34) [13]
Когда первая программа, создавшая мютекс закрылась, то вторая которая проверяет наличие мютекса не определяет что его нет. Хотя если запустить вторую программу без первой, то она определяет что мютекса нет.
alpet ©   (21.04.05 13:27) [10]
CloseHandle делаю.


 
Eraser ©   (2005-04-21 13:45) [17]

Stanislav ©

НОРМАЛЬНО приведи:
1. Код первой программы (хотя бы проверку и инициализацию)
2. Код второй программы.

alpet ©

В случае работы с памятью ты на 110% прав, НЕОБХОДИМО освобождать память самому. Но в данном случае конечно можно закрывать дескриптор где-нибудь в OnDestroy главной формы, но это опять таки не очень правильно... вдруг программа подвиснит после OnDestroy...


 
Stanislav ©   (2005-04-21 13:55) [18]

Первая очень большая, но все что касается Мютекса вот:
Инициализация:
HUMutex:=CreateMutex (NIL,false,"SS_Mutex_ForUpdate");
Ну, и вконце CloseHandle (HUMutex), это я дописал потом.
А вторая вот
procedure TForm1.Timer1Timer(Sender: TObject);
Var T:Array [1..2] of string;
   HMutex:Integer;
begin
HMutex:=OPenmutex(MUTEX_ALL_ACCESS ,false,"SS_Mutex_ForUpdate");
//if (getLastError<>ERROR_ALREADY_EXISTS) then
//HMutex:=FindWindow ("TFmTest","fmTest");
if HMutex=0 then
begin
 if LoadText (t,"fl.txt") then //чтение из файла путей
  UpdateFiles (t[1],t[2]); // обновление файлов
  Application.Terminate;
end;

end;


 
Stanislav ©   (2005-04-21 14:02) [19]

Суть программы:
Есть несколько модулей, которые работают с одной Dll, каждый модуль может вызвать другой после чего сам закрывается.
Нужно по закрытию последнего модуля обновить dll с сервера.
Для чего и служит вторая программа.
Мютексы создаются в процедуре dll - Start, которая вызывается каждым модулем при старте.
Каждый модуль на закрытие вызывает программу обновления dll (вторую). Она должна проверить нет ли мьютекса и если нет, то выполнится, а если есть, то ждать пока его не станет, а потом выполнить обновления. Либо закрыться если мютекс существует в течении 30 сек. (этого я еще не делал)


 
Eraser ©   (2005-04-21 14:13) [20]

Stanislav ©
Каждый модуль на закрытие вызывает программу обновления dll (вторую).


Тогда CloseHandle должен выполнятся ДО вызова другой программы... а вообще логика не верная.

Я бы посоветовал использовать ф-ю WaitForSingleObject. Внутри длл просле успешного создания мьютекса заходить в него (второй параметр = true), а после запуска 2 программы попробовать открыть мьютекс и если он занят- ждать WaitForSingleObject(можно 30 секунд).


 
Stanislav ©   (2005-04-21 14:25) [21]

Понятно, спасибо.


 
alpet ©   (2005-04-21 14:28) [22]

В случае работы с памятью ты на 110% прав, НЕОБХОДИМО освобождать память самому. Но в данном случае конечно можно закрывать дескриптор где-нибудь в OnDestroy главной формы, но это опять таки не очень правильно... вдруг программа подвиснит после OnDestroy...

Я такого поворота событий не учел. Но тут опять же специализованный прямой подход будет правильней - WaitForSingleObject применительно к дескриптору процесса. Не нужно будет создавать какие либо дополнительные ГОС, хотя сам дескриптор извлекать будет сложнее.

А обновление файла DLL можно совершить проверяя его на доступность OpenFile (..., OF_SHARE_EXCLUSIVE).


 
Eraser ©   (2005-04-21 14:33) [23]

alpet ©
будет правильней - WaitForSingleObject применительно к дескриптору процесса.


Согласен. Но без мьютексов не обойтись... и та и другая программа должны быть запущены в 1 экземпляре.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
4-1114422458
ANB
2005-04-25 13:47
2005.06.14
Есть ли функция, позволяющая скопировать папку ?


1-1117089247
Scorpio
2005-05-26 10:34
2005.06.14
Жуткие тормоза при отправке данных в Excel


4-1114517267
zero-g
2005-04-26 16:07
2005.06.14
Глобальный перехват нажатия комбинации клавиш


3-1115902646
MakNik
2005-05-12 16:57
2005.06.14
dxDBGrid


14-1117123767
Магнитоныч
2005-05-26 20:09
2005.06.14
:)) Для хорошего настроения посетите





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