![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мьютексы в потоке [D7, WinXP]
Sam Stone © (2006-06-28 22:25:00)Доброго времени суток.
Как создать мьютекс в потоке (TThread) так, чтобы потом в основном потоке программы можно было проверить создан он или нет? Просто CreateMutex с тем же именем ни к чему не приводит :(
Sam Stone (2006-06-29 00:26:00) [1]Еще раз спасибо )
ЗЫ
пошел в яндекс - нашел вот это: http://www.delphimaster.ru/cgi-bin/nuts.pl?showpage=6:)))
Eraser (2006-06-29 00:21:00) [2]> [42] Sam Stone © (29.06.06 00:20)
> поищу книгу
тут есть http://rouse.front.ru/
Sam Stone (2006-06-29 00:20:00) [3]Что ж, спасибо, поищу книгу, попробую осилить ;-) Спасибо )
Eraser (2006-06-29 00:16:00) [4]> [39] Sam Stone © (29.06.06 00:14)
> Основной поток не видит мьютексы в "доп" потоках?
видит, ну лучше почитать Рихтера, там все очень понятно и на примерох разьясняется, такие вопросы отпадут сами собой.
> Я пойду учить потоки
вот с этого и надо было начинать :)
Eraser (2006-06-29 00:14:00) [5]> Ну туда можно, например, Application.processmessages сунуть
while not q.terminated do
begin
Application.ProcessMessages;
Sleep(1);
end;
q.Free;
halt;
ну что ж.. можно конечно, но как-то не очень.
Sam Stone (2006-06-29 00:14:00) [6]> Eraser © (29.06.06 00:10) [38]
абсолютно не причем. Вот кольнуло мне. А теперь интесно - в чем именно косяк. Основной поток не видит мьютексы в "доп" потоках? Если не хотите отвечать можно свернуть разговор. Я пойду учить потоки и радоваться WaitFor'ру.
Eraser (2006-06-29 00:10:00) [7]> [37] Sam Stone © (29.06.06 00:08)
да при чем тут вообще мьютексы? дескриптор потока сам по себе может выступать объектом синхронизации!
Sam Stone (2006-06-29 00:08:00) [8]> Fay © (29.06.06 00:05) [33]
Правильно, зациклились. Почему тогда программа завершилась СРАЗУ же по halt? Для "правильности" можно в конце работы потока ReleaseMutex добавить.
Fay (2006-06-29 00:08:00) [9]2 Sam Stone © (29.06.06 0:05) [34]
> Application.processmessages сунуть, чтоб и проц не отъедало
Ложитесь спать
Eraser (2006-06-29 00:07:00) [10]> [32] Sam Stone © (29.06.06 00:03)
> задача - подождать пока отработает код в потоке(не я его
> туда заносил и вынимать не надо) и после зарубить программу.
если программа не консольная, все таки не очень хорошо, если она будет подвисать на довольно большой промежуток времени, поэтому советую работать с доп. потоком асинхронно, а не дожидаться его завершения, усыпляя основной поток.
Sam Stone (2006-06-29 00:05:00) [11]> Eraser © (29.06.06 00:01) [31]
Ну туда можно, например, Application.processmessages сунуть, чтоб и проц не отъедало от выполнения основной задачи, и окно программы не "зависало".
Fay (2006-06-29 00:05:00) [12]2 Leonid Troyanovsky © (28.06.06 23:58) [28]
ОК, понял
2 Sam Stone © (28.06.06 23:57) [27]
Перефразируем.
купить_бутылку_водки(0.75, 40, 'Смирнофф');
...
купить_бутылку_водки(0.5, 40, 'Смирнофф');
while ПроверитьХолодильник() = ВОДКА_УЖЕ_ЕСТЬ do
купить_бутылку_водки(0.5, 40, 'Смирнофф');
Денюшек может не хватить
Sam Stone (2006-06-29 00:03:00) [13]> Eraser © (28.06.06 23:59) [29]
задача - подождать пока отработает код в потоке(не я его туда заносил и вынимать не надо) и после зарубить программу. Честно говоря, про WaitFor не знал :(
Просто попробовал "пощупать" мьютексы, заинтересовало в чем косяк.
Eraser (2006-06-29 00:01:00) [14]> [20] Sam Stone © (28.06.06 23:44)
в том, что:
1. убого.
2. скорее всего будет кушать 99.5% процессорного времени.
Sam Stone (2006-06-29 00:00:00) [15]Тьфу, не дописал...
> Eraser © (28.06.06 23:50) [26]
>> [20] Sam Stone © (28.06.06 23:44)
> вот сразу бы так и сказал ))
Собсно интересует в чем НЕработоспособность [20].
Eraser (2006-06-28 23:59:00) [16]> [27] Sam Stone © (28.06.06 23:57)
> q.WaitFor, как я понимаю, вместо дури While GetLastError...
> ?
именно, хотя и делает бесполезным использование доп. потока.
> Не понял насмешки. Перед while еще один createmutex, GetLastError
> будет с него начинать. Или я не прав?
какая конкретно задача?
Leonid Troyanovsky (2006-06-28 23:58:00) [17]
> Fay © (28.06.06 23:46) [22]
> Никто не мешает дубликату быть глобальной переменной 8))
Если все поткоки разрабатывались в рамках одного приложения,
то, проблем, видимо, быть не должно (в смысле организации
хранения валидной ссылки).
Однако, в любом случае, если некоему потоку удалось
DuplicateHandle, то, далее, он может быть спокоен относительно
дальнйших планов всех остальных.
--
Regards, LVT.
Sam Stone (2006-06-28 23:57:00) [18]> Eraser © (28.06.06 23:50) [26]
q.WaitFor, как я понимаю, вместо дури While GetLastError... ?
> Fay © (28.06.06 23:50) [24]
Не понял насмешки. Перед while еще один createmutex, GetLastError будет с него начинать. Или я не прав?
Fay (2006-06-28 23:50:00) [19]2 Sam Stone © (28.06.06 23:44) [20]
Terminate в TMythead.execute явно лишний
while GetLastError=ERROR_ALREADY_EXISTS do
CreateMutex(nil,true,'aaa');
LOL
Спокойной ночи 8)
Sam Stone (2006-06-28 23:50:00) [20]>Eraser © (28.06.06 23:48) [23]
см [20]