Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо