Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

Не освобождается мьютех, почему?   Найти похожие ветки 

 
NX   (2007-11-17 15:00) [0]

Программа создает мъютех, но освободить его не может
RaiseLastWin32Error возвращает:

System Error.  Code: 288.
Попытка освободить не принадлежащий процессу объект синхронизации.

Но мьютех создается то в этом роцессе и освобождается в там же, в чем причина?


 
Kolan ©   (2007-11-17 15:04) [1]

> Но мьютех создается то в этом роцессе и освобождается в
> там же, в чем причина?

Есть подозрение, что в коде программы&#133


 
Leonid Troyanovsky ©   (2007-11-17 15:06) [2]


> NX   (17.11.07 15:00)  

> Но мьютех создается то в этом роцессе и освобождается в
> там же, в чем причина?

Как создается и освобождается.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-11-17 15:08) [3]


> Kolan ©   (17.11.07 15:04) [1]

> Есть подозрение, что в коде программы…

Возможно, что и в версии дельфи/ОС.

--
Regards, LVT.


 
NX   (2007-11-17 16:10) [4]

Вот пример кинул:

var
 Form1: TForm1;

 HSvcMtx: THandle;

Const
  SvcMutex = "Service mutex";
  APPMutex = "Application mutex";

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 HSvcMtx:=CreateMutex(nil,false,SvcMutex);
 Win32Check(HSvcMtx <> 0);
 if GetLastError <> ERROR_ALREADY_EXISTS then
   ShowMessage("Create = "+SvcMutex)
 else ShowMessage("No Create = "+SvcMutex);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Win32Check(ReleaseMutex(HSvcMtx));
 RaiseLastWin32Error;
end;


 
Leonid Troyanovsky ©   (2007-11-17 16:18) [5]


> NX   (17.11.07 16:10) [4]

>  HSvcMtx:=CreateMutex(nil,false,SvcMutex);

>  Win32Check(ReleaseMutex(HSvcMtx));

Ну, дык он создается незахваченным (false),
что ж тогда освобождать.

--
Regards, LVT.


 
MBo ©   (2007-11-17 16:21) [6]

Не видно захвата мьютекса, т.к. создается он свободным
HSvcMtx:=CreateMutex(nil,false,SvcMutex);


 
NX   (2007-11-17 16:25) [7]


> Ну, дык он создается незахваченным (false), что ж тогда
> освобождать.


В примере неправильно было, сорри, даже в положении истина он не освобождается. как делал: два приложения таких запустил в первом создал, освободил второе все равно не захватывает.


 
Leonid Troyanovsky ©   (2007-11-17 16:38) [8]

> NX   (17.11.07 16:25) [7]

> В примере неправильно было, сорри, даже в положении истина
> он не освобождается. как делал: два приложения таких запустил
> в первом создал, освободил второе все равно не захватывает.

Если это, дейс-но, сервис и приложения, то, вероятно,
у приложения не хватает прав.
Попробуй создать с security descriptor не nil,
а открытым для всех.

--
Regards, LVT.


 
NX   (2007-11-17 17:04) [9]


> Leonid Troyanovsky ©   (17.11.07 16:38) [8]


Это простое приложение пока, но в сервисе это будет стоять в дальнейшем.
Что - то в обыкновенном примере (просто проект форма 2 батона) и не работает. Есть еще условие, что я работаю с правами "опытного пользователя", но запускал под администратором всеравно таже хрень происходить , версия: BDS 2006 трех дисковая (кракнутая). система WinXP SP2 Pro Corp. Ed. rus.


 
Leonid Troyanovsky ©   (2007-11-17 17:07) [10]


> NX   (17.11.07 17:04) [9]

> Что - то в обыкновенном примере (просто проект форма 2 батона)
> и не работает

Код - в студию.

--
Regards, LVT.


 
NX   (2007-11-17 17:12) [11]


> Leonid Troyanovsky ©   (17.11.07 17:07) [10]


Он уже в студии: NX   (17.11.07 16:10) [4]
исправте только CreateMutex(nil,false,SvcMutex); на true

у меня этот код и есть не рабочий даже со значением true


 
Leonid Troyanovsky ©   (2007-11-17 17:25) [12]


> NX   (17.11.07 17:12) [11]

> исправте только CreateMutex(nil,false,SvcMutex); на true

RaiseLastWin32Error - лишний, а так
вполне себе работает.

--
Regards, LVT.


 
NX   (2007-11-17 18:59) [13]


> Leonid Troyanovsky ©   (17.11.07 17:25) [12]


> RaiseLastWin32Error


дык он там стоял, что бы понять суть роисходящего.

Вот это саме и не работает, хм......


 
NX   (2007-11-17 19:11) [14]

ReleaseMutex(HSvcMtx)
его освобождает, но неудаляет, тогда все равильно, только я не правильно захватываю его.
как захватить уже созданный мютекс?


 
Leonid Troyanovsky ©   (2007-11-17 19:18) [15]


> NX   (17.11.07 19:11) [14]

> я не правильно захватываю его.
> как захватить уже созданный мютекс?

WaitForSingleObject, например.

--
Regards, LVT.


 
NX   (2007-11-17 19:31) [16]

а как уничтожить? через CloseHandle()


 
Leonid Troyanovsky ©   (2007-11-17 19:42) [17]


> NX   (17.11.07 19:31) [16]

> а как уничтожить? через CloseHandle()

Уничтожает его ОС (как, собс-но, и создает),
при закрытии последнего удерживаемого хендла.
Либо при кончине потока, удерживавшего мьютекс.

--
Regards, LVT.


 
NX   (2007-11-17 20:31) [18]


> Leonid Troyanovsky ©   (17.11.07 19:42) [17]


убивается через CloseHandle() однако.


 
Leonid Troyanovsky ©   (2007-11-17 20:39) [19]


> Leonid Troyanovsky ©   (17.11.07 19:42) [17]

> Либо при кончине потока, удерживавшего мьютекс.

Это относится к освобождению, sorry.

--
Regards, LVT.


 
NX   (2007-11-17 21:40) [20]

Странная штука, когда в одном приложении использывается CloseHandle(),
то можно мютекс заново создать, но как только его поимеет другое приложение, то CloseHandle() уже не прокатывает, только через закрытие программы.


 
Leonid Troyanovsky ©   (2007-11-17 21:59) [21]


> NX   (17.11.07 21:40) [20]

Путанник.
Почитал бы уж что-нибудь, хотя бы msdn.

--
Regards, LVT.


 
NX   (2007-11-17 22:49) [22]


> Почитал бы уж что-нибудь, хотя бы msdn.


слушаюсь и повинуюсь...  :-)



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

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
2-1216363326
abhtr
2008-07-18 10:42
2008.08.24
Как записать текстовый файл в DOS кодировке


2-1216194913
Gamer
2008-07-16 11:55
2008.08.24
как лучше сделать выбор с БД


2-1216200887
multiflex
2008-07-16 13:34
2008.08.24
Не полная блокировка файла


2-1216636182
Оксана Вл.
2008-07-21 14:29
2008.08.24
Pos


2-1216645839
antonn
2008-07-21 17:10
2008.08.24
назначить процедуру в событии...