![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не освобождается мьютех, почему?
NX © (2007-11-17 15:00:00)Программа создает мъютех, но освободить его не может
RaiseLastWin32Error возвращает:
System Error. Code: 288.
Попытка освободить не принадлежащий процессу объект синхронизации.
Но мьютех создается то в этом роцессе и освобождается в там же, в чем причина?
NX (2007-11-17 22:49:00) [1]
> Почитал бы уж что-нибудь, хотя бы msdn.
слушаюсь и повинуюсь... :-)
Leonid Troyanovsky (2007-11-17 21:59:00) [2]
> NX (17.11.07 21:40) [20]
Путанник.
Почитал бы уж что-нибудь, хотя бы msdn.
--
Regards, LVT.
NX (2007-11-17 21:40:00) [3]Странная штука, когда в одном приложении использывается CloseHandle(),
то можно мютекс заново создать, но как только его поимеет другое приложение, то CloseHandle() уже не прокатывает, только через закрытие программы.
Leonid Troyanovsky (2007-11-17 20:39:00) [4]
> Leonid Troyanovsky © (17.11.07 19:42) [17]
> Либо при кончине потока, удерживавшего мьютекс.
Это относится к освобождению, sorry.
--
Regards, LVT.
NX (2007-11-17 20:31:00) [5]
> Leonid Troyanovsky © (17.11.07 19:42) [17]
убивается через CloseHandle() однако.
Leonid Troyanovsky (2007-11-17 19:42:00) [6]
> NX (17.11.07 19:31) [16]
> а как уничтожить? через CloseHandle()
Уничтожает его ОС (как, собс-но, и создает),
при закрытии последнего удерживаемого хендла.
Либо при кончине потока, удерживавшего мьютекс.
--
Regards, LVT.
NX (2007-11-17 19:31:00) [7]а как уничтожить? через CloseHandle()
Leonid Troyanovsky (2007-11-17 19:18:00) [8]
> NX (17.11.07 19:11) [14]
> я не правильно захватываю его.
> как захватить уже созданный мютекс?
WaitForSingleObject, например.
--
Regards, LVT.
NX (2007-11-17 19:11:00) [9]ReleaseMutex(HSvcMtx)
его освобождает, но неудаляет, тогда все равильно, только я не правильно захватываю его.
как захватить уже созданный мютекс?
NX (2007-11-17 18:59:00) [10]
> Leonid Troyanovsky © (17.11.07 17:25) [12]
> RaiseLastWin32Error
дык он там стоял, что бы понять суть роисходящего.
Вот это саме и не работает, хм......
Leonid Troyanovsky (2007-11-17 17:25:00) [11]
> NX (17.11.07 17:12) [11]
> исправте только CreateMutex(nil,false,SvcMutex); на true
RaiseLastWin32Error - лишний, а так
вполне себе работает.
--
Regards, LVT.
NX (2007-11-17 17:12:00) [12]
> 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:07:00) [13]
> NX (17.11.07 17:04) [9]
> Что - то в обыкновенном примере (просто проект форма 2 батона)
> и не работает
Код - в студию.
--
Regards, LVT.
NX (2007-11-17 17:04:00) [14]
> Leonid Troyanovsky © (17.11.07 16:38) [8]
Это простое приложение пока, но в сервисе это будет стоять в дальнейшем.
Что - то в обыкновенном примере (просто проект форма 2 батона) и не работает. Есть еще условие, что я работаю с правами "опытного пользователя", но запускал под администратором всеравно таже хрень происходить , версия: BDS 2006 трех дисковая (кракнутая). система WinXP SP2 Pro Corp. Ed. rus.
Leonid Troyanovsky (2007-11-17 16:38:00) [15]> NX (17.11.07 16:25) [7]
> В примере неправильно было, сорри, даже в положении истина
> он не освобождается. как делал: два приложения таких запустил
> в первом создал, освободил второе все равно не захватывает.
Если это, дейс-но, сервис и приложения, то, вероятно,
у приложения не хватает прав.
Попробуй создать с security descriptor не nil,
а открытым для всех.
--
Regards, LVT.
NX (2007-11-17 16:25:00) [16]
> Ну, дык он создается незахваченным (false), что ж тогда
> освобождать.
В примере неправильно было, сорри, даже в положении истина он не освобождается. как делал: два приложения таких запустил в первом создал, освободил второе все равно не захватывает.
MBo (2007-11-17 16:21:00) [17]Не видно захвата мьютекса, т.к. создается он свободным
HSvcMtx:=CreateMutex(nil, false,SvcMutex);
Leonid Troyanovsky (2007-11-17 16:18:00) [18]
> NX (17.11.07 16:10) [4]
> HSvcMtx:=CreateMutex(nil,false,SvcMutex);
> Win32Check(ReleaseMutex(HSvcMtx));
Ну, дык он создается незахваченным (false),
что ж тогда освобождать.
--
Regards, LVT.
NX (2007-11-17 16:10:00) [19]Вот пример кинул:
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 15:08:00) [20]
> Kolan © (17.11.07 15:04) [1]
> Есть подозрение, что в коде программы…
Возможно, что и в версии дельфи/ОС.
--
Regards, LVT.