![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
Здравствуйте. Создаю поток CreateThreed(...), как его убить. WaitForSingleObject не использую, просто создаю поток, он мне нужен для загрузки ресурсов. По идее он должен сам убится, когда функция возвращает 0, но у меня он и дальше висит:(
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
||||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| bugmenot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 3.7.2006 Репутация: 0 Всего: 1 |
HANDLE закрываешь?
Можно прям так: CloseHandle(CreateThreed(...)); --------------------
доска объявленийвсе о горных велосипедах |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
это только обнуляет описатель, после чего его нельзя использовать, однако это не значит, что сам поток уничтожен. По классике:
|
|||
|
||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
Почему напрасно? в моем случае поток должен отработать и убится mrbrooks, , тоесть return 0?? Это сообщение отредактировал(а) Graf_h - 4.6.2009, 11:21 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
||||
|
||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: нет Всего: 5 |
mrbrooks, спасибо
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
| asd |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
Прежде чем говорить такое и приводить цитаты про :
неплохо бы разобраться, что человеку нужно. Во-первых раз тема в этом разделе, то ненадо давать советов, что лучше использовать beginthreadex вместо CreateThread, Windows тут ни при чём. Во-втиорых каким образом в уничтожении потока нам поможет WaitForSingleObject совершенно не ясно, разве что хендл прикрыть по его завершении. Но если он не нужен, то лучше вызвать CloseHandle сразу после CreateThread. В третьих, если поток создаётся с помощбю CreateThread, то почти никакой разницы между return ExitStatus и ExitThread(ExitStatus) нет. По крайней мере я не вижу никакой, кроме того, что при ExitThread(ExitStatus) можно стек вернуть на в том состоянии, в котором он был на входе в поток. Graf_h, Чтобы потоки не висели закрывай хендл потока, как только он тебе больше не нужен(Не надо ждать завершения самого потока, ему всё равно, закроешь ты хендл или нет) т.е. слушай, что сказал bugmenot. А чтобы знать когда применять CreateThread, а когда нет, прочитай Рихтера и думай мозгом Это сообщение отредактировал(а) asd - 4.6.2009, 12:49 |
||||
|
|||||
| mrbrooks |
|
||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
Тебя вот забыл спросить. Просто не дождался. RTFM Тебя не проведешь. Это ты у нас гений.
Кого волнует что ты видишь? |
||||
|
|||||
| asd |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
mrbrooks
Однако, а хоть 1 аргумент? И по поводу чего мне идти доки читать? |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вообще-то разница может быть довольно значительной:
ExitThread в этом случае просто завершит поток, при этом, восстановление стека совсем не означает, что все необходимые данные будут освобождены, и уж тем более, сброшены какие-либо внутренние флаги активности (т.е. необходимые действия после 12 строки) мозгом тут нужно думать независимо от того, надо ли ждать завершения потока или нет
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
asd, дорогой друг.
1. Желательное использование beginthreadex/endthreadex в Windows при программировании на С++ не плод моей фантазии. Это совет г-на Рихтера. 2. Цитата - взята у того же г-на Рихтера по средствам копирования/вставки через буфер обмена. 3. WaitForSingleObject позволяет узнать завершился ли поток или нет. Подробности тут. И опять таки - см. г-на Рихтера. Я конечно понимаю что ты офигенно классный парень - но уж если начинаешь поучать то бей аргументами - а не то, что там тебе кажется или видится. Добавлено через 1 минуту и 18 секунд GremlinProg, да все вроде ок |
|||
|
||||
| bugmenot |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 3.7.2006 Репутация: 0 Всего: 1 |
Я не совсем понял эту разницу, но вот что я знаю наверняка: При return-е, функция возвращается в kernel32.dll, а там сразу вызывается тот же ExitThread.
Не все люди пишут на С++, я например на С пишу.
WaitForSingleObject, как подсказывает название, ждет, пока завершится поток или закончится таймаут. Чтобы узнать, завершился ли поток, лучше наверно воспользоваться GetExitCodeThread. Да, слушайте меня! --------------------
доска объявленийвсе о горных велосипедах |
||||
|
|||||
| asd |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
Стоп. ExitThread, естественно, надо вызывать, когда ф-ия потока уже всё освободила и сделала всё что нужно. Фактически я говорю об идентичности return rv; и ExitThread(rv); если этот поток был создан через CreateThread, ибо после return ExitStatus мы попадаем на
В вашем коде rv = MainRoutine(...); это вызов DWORD Routine(...) ? если так, то ясно, что так вызывать ExitThread нельзя. mrbrooks, Всё это конечно хорошо, если мы пишем на с++ с использованием rtl. Раз тема находится в этом разделе и человек вызывает CreateThread, то я думаю, что пишет он на винапи. А мешать Винапи и beginthreadex/endthreadex бессмысленно. Если вы почитаете Рихтера внимательнее, то увидите, что он рекомендует вызавать beginthreadex/endthreadex по причинам, которые никак с виндой не связанны.
что делает WaitForSingleObject мне известно. Только проблема состоит в том, что.
И вот вопрос, зачем вызывать WaitForSingleObject? И чем он нам может почочь? |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |