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

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

Мьютексы в потоке [D7, WinXP]


Страницы:   1 2 3

Sam Stone ©   (2006-06-28 22:25:00) 

Доброго времени суток.
Как создать мьютекс в потоке (TThread) так, чтобы потом в основном потоке программы можно было проверить создан он или нет? Просто CreateMutex с тем же именем ни к чему не приводит :(


Fay   (2006-06-28 23:50:00) [21]

2 Sam Stone ©   (28.06.06 23:44) [20]
Terminate в TMythead.execute явно лишний

while GetLastError=ERROR_ALREADY_EXISTS do
    CreateMutex(nil,true,'aaa');

LOL

Спокойной ночи 8)


Eraser   (2006-06-28 23:48:00) [22]

> [14] Sam Stone ©   (28.06.06 23:24)


> надо же как-то ругнуться.

обращаться из доп. потока к VCL недопустимо, лучше уж тогда использовать Windows.MessageBox, хотя я вообще противник диалога с пользователем из доп. потоков.

> в любом случае запускал процесс длительный, в котором создавал
> в начале мьютекс, который зарубался в конце работы, а в
> основном потоке после этого пытался создать с тем же именем
> (глуповатый пример ожидания завершения работы потока) -
> создавался и все пролетало.

как-то непонятно объяснил )


Fay   (2006-06-28 23:46:00) [23]

2 Leonid Troyanovsky ©   (28.06.06 23:44) [21]
Леонид, это уже фашизм.
Никто не мешает дубликату быть глобальной переменной 8))


Leonid Troyanovsky   (2006-06-28 23:44:00) [24]


> Fay ©   (28.06.06 23:38) [18]

> Самодурство - это CloseHandle?


Можно также представить изменение глобальной переменной,
на которую рассчитывал вторичный поток.

--
Regards, LVT.


Sam Stone   (2006-06-28 23:44:00) [25]

Fay ©   (28.06.06 23:37) [17]
Пробовал. Запутался окончательно :) Значит пора спать :))
тогда такой код:
тот же execute
procedure TMythead.execute;
begin
 createmutex(nil,true,'aaa');
 sleep(5000);
 Terminate;
end;
procedure TForm1.Button1click;
var q:TMyThread;
begin
 //вариант 1
 q:=TMyThread.create(false);
 CreateMutex(nil,true,'aaa');
 while GetLastError=ERROR_ALREADY_EXISTS do
     CreateMutex(nil,true,'aaa');
 halt;
//вылетает сразу
//вариант 2
 q:=TMyThread.create(false);
 while not q.terminated do;
 halt;
//добросовесно ждет
end;
Вопрос: чего я тут не понимаю? :)


Leonid Troyanovsky   (2006-06-28 23:41:00) [26]


> Sam Stone ©   (28.06.06 23:24) [14]


> смотрел примеры запрета запуска второй копии приложения,
>  там таким макаром реализовано.

Таких примеров море.

> Возможно надо будет с утра пересмотреть ;)

Тогда, следует смотреть лишь лучшие.

--
Regards, LVT.


Fay   (2006-06-28 23:38:00) [27]

2 Leonid Troyanovsky ©   (28.06.06 23:37) [16]
Самодурство - это CloseHandle?


Fay   (2006-06-28 23:37:00) [28]

2 Sam Stone ©   (28.06.06 23:24) [14]
> надо же как-то ругнуться.
Ладно, Гейтс тебе судья. А брякпойнт после then не пробовал ставить?


Leonid Troyanovsky   (2006-06-28 23:37:00) [29]


> Fay ©   (28.06.06 23:26) [15]

> А это имеет смысл в рамках одного процесса?


Пуркуа бы не нет?
Изловчившийся сохранить значение хендла в своей локальной переменной
вторичный поток будет застрахован от самодурства первичного.

--
Regards, LVT.


Fay   (2006-06-28 23:26:00) [30]

2 Leonid Troyanovsky ©   (28.06.06 23:22) [13]
А это имеет смысл в рамках одного процесса?
Я не понимаю ...


Sam Stone   (2006-06-28 23:24:00) [31]

Leonid Troyanovsky ©   (28.06.06 23:20) [12]
смотрел примеры запрета запуска второй копии приложения, там таким макаром реализовано.
Возможно надо будет с утра пересмотреть ;)

Fay ©   (28.06.06 23:16) [10]
надо же как-то ругнуться.
в любом случае запускал процесс длительный, в котором создавал в начале мьютекс, который зарубался в конце работы, а в основном потоке после этого пытался создать с тем же именем (глуповатый пример ожидания завершения работы потока) - создавался и все пролетало.


Leonid Troyanovsky   (2006-06-28 23:22:00) [32]


> Fay ©   (28.06.06 23:17) [11]

> А зачем DuplicateHandle? Я не понял...


Если приобретателю хендла важна его валидность,
то без оного трудно обойтись.

--
Regards, LVT.


Leonid Troyanovsky   (2006-06-28 23:20:00) [33]


> Sam Stone ©   (28.06.06 23:12) [7]


> >> А что возвращает сама  CreateMutex?
> хэндл.

Кто б мог подумать.
"Что" может означать лишь значение.
Иначе, за кого ты нас принимаешь? :)

>  CreateMutex(nil,true,'aaa');
>  if GetLastError=ERROR_ALREADY_EXISTS then showmessage('asd');

Дык вот, проверять оное имеет смысл, если возвращаемое
CreateMutex <> 0

Ну, а далее посмотрим.

--
Regards, LVT.


Fay   (2006-06-28 23:17:00) [34]

2 Leonid Troyanovsky ©   (28.06.06 22:50) [3]
А зачем DuplicateHandle? Я не понял...


Fay   (2006-06-28 23:16:00) [35]

> showmessage('asd');
Какой ещё нафиг showmessage?


Eraser   (2006-06-28 23:14:00) [36]

> патерится

п := м;


Eraser   (2006-06-28 23:14:00) [37]

> [7] Sam Stone ©   (28.06.06 23:12)


> Не матерится.

странно что не патери тся. ;-)


Sam Stone   (2006-06-28 23:12:00) [38]

>> А что возвращает сама  CreateMutex?
хэндл.

>> Fay ©   (28.06.06 22:57) [4]
TMyThread = class(TThread)
procedure Execute;overload;
end;
...
procedure TMyThread.Execute;
begin
 CreateMutex(nil,true,'aaa');
 if GetLastError=ERROR_ALREADY_EXISTS then showmessage('asd');
end;
...
procedure TForm1.Button1Click();
var t:TMyThread;
begin
 ...
 CreateMutex(nil,true,'aaa');
 t:=TMyThread.create(false);
 ...
end;
Не матерится.


Eraser   (2006-06-28 23:09:00) [39]

> [0] Sam Stone ©   (28.06.06 22:25)


> Как создать мьютекс в потоке (TThread) так, чтобы потом
> в основном потоке программы можно было проверить создан
> он или нет? Просто CreateMutex с тем же именем ни к чему
> не приводит :(

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


Leonid Troyanovsky   (2006-06-28 23:01:00) [40]


> Sam Stone ©   (28.06.06 22:37) [2]
> Если повторно создать мьютекс с тем же именем GetLastError
> вернет ошибку ERROR_ALREADY_EXISTS. Этого не происходит.


А что возвращает сама  CreateMutex?

--
Regards, LVT.


Страницы:   1 2 3

Наверх

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