![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мьютексы в потоке [D7, WinXP]
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.