Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как удалить поток? 
V
    Опции темы
Graf_h
Дата 3.6.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: нет
Всего: 5



Здравствуйте. Создаю поток CreateThreed(...), как его убить. WaitForSingleObject не использую, просто создаю поток, он мне нужен для загрузки ресурсов. По идее он должен сам убится, когда функция возвращает 0, но у меня он и дальше висит:(


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
mrbrooks
Дата 3.6.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(Graf_h @  3.6.2009,  18:28 Найти цитируемый пост)
Создаю поток CreateThreed(...)

в Windows лучше использовать beginthreadex/endthreadex


Цитата(Graf_h @  3.6.2009,  18:28 Найти цитируемый пост)
WaitForSingleObject не использую

совершенно напрасно батенька. smile достаточно дельный и простой способ проконтролировать жизнедеятельность потока.
PM MAIL   Вверх
jonie
Дата 3.6.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата
По идее он должен сам убится, когда функция возвращает 0, но у меня он и дальше висит:(

это вы как определили? Диспетчер потоков убъет его когда будет время....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bugmenot
Дата 3.6.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 3.7.2006

Репутация: 0
Всего: 1



HANDLE закрываешь?
Можно прям так:
CloseHandle(CreateThreed(...));

smile
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
mrbrooks
Дата 4.6.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(bugmenot @  3.6.2009,  19:48 Найти цитируемый пост)
HANDLE закрываешь?
Можно прям так:
CloseHandle(CreateThreed(...));


это только обнуляет описатель, после чего его нельзя использовать, однако это не значит, что сам поток уничтожен. 

По классике:
Цитата

Поток можно завершить четырьмя способами: 
функция потока возвращает управление (рекомендуемый способ), 
поток самоуничтожается вызовом функции ExitThread (нежелательный способ); 
один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ); 
завершается процесс, содержащий данный поток (тоже нежелательно). 



PM MAIL   Вверх
Graf_h
Дата 4.6.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: нет
Всего: 5



Цитата(mrbrooks @  4.6.2009,  07:58 Найти цитируемый пост)

Цитата(Graf_h @  3.6.2009,  18:28 )
WaitForSingleObject не использую
совершенно напрасно батенька.  достаточно дельный и простой способ проконтролировать жизнедеятельность потока.
 Почему напрасно? в моем случае поток должен отработать и убитсяsmile(я так думаю). Мне он нужен только один оаз.

mrbrooks, 
Цитата(mrbrooks @  4.6.2009,  07:58 Найти цитируемый пост)
функция потока возвращает управление (рекомендуемый способ), 
, тоесть return 0??

Это сообщение отредактировал(а) Graf_h - 4.6.2009, 11:21


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
mrbrooks
Дата 4.6.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(Graf_h @  4.6.2009,  11:18 Найти цитируемый пост)
Почему напрасно? в моем случае поток должен отработать и убитсяsmile(я так думаю). Мне он нужен только один оаз.

контроль наше все  smile 


Цитата(Graf_h @  4.6.2009,  11:18 Найти цитируемый пост)
, тоесть return 0??

 smile 
PM MAIL   Вверх
Graf_h
Дата 4.6.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: нет
Всего: 5



mrbrooks,  спасибоsmile


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
asd
Дата 4.6.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: 1
Всего: 1



Цитата(mrbrooks @  3.6.2009,  19:18 Найти цитируемый пост)
в Windows лучше использовать beginthreadex/endthreadex


Цитата(mrbrooks @  3.6.2009,  19:18 Найти цитируемый пост)
совершенно напрасно батенька.  достаточно дельный и простой способ проконтролировать жизнедеятельность потока.


Прежде чем говорить такое и приводить цитаты про :
Цитата(mrbrooks @  4.6.2009,  07:58 Найти цитируемый пост)
функция потока возвращает управление (рекомендуемый способ), поток самоуничтожается вызовом функции ExitThread (нежелательный способ); 


неплохо бы разобраться, что человеку нужно.
Во-первых раз тема в этом разделе, то ненадо давать советов, что лучше использовать beginthreadex вместо CreateThread, Windows тут ни при чём.
Во-втиорых каким образом в уничтожении потока нам поможет WaitForSingleObject совершенно не ясно, разве что хендл прикрыть по его завершении. Но если он не нужен, то лучше вызвать CloseHandle сразу после CreateThread.
В третьих, если поток создаётся с помощбю CreateThread, то почти никакой разницы между return ExitStatus и ExitThread(ExitStatus) нет. По крайней мере я не вижу никакой, кроме того, что при ExitThread(ExitStatus) можно стек вернуть на в том состоянии, в котором он был на входе в поток.


Graf_h, 
Чтобы потоки не висели закрывай хендл потока, как только он тебе больше не нужен(Не надо ждать завершения самого потока, ему всё равно, закроешь ты хендл или нет) т.е. слушай, что сказал  bugmenot. А чтобы знать когда применять CreateThread, а когда нет, прочитай Рихтера и думай мозгомsmile

Это сообщение отредактировал(а) asd - 4.6.2009, 12:49
PM MAIL   Вверх
mrbrooks
Дата 4.6.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(asd @  4.6.2009,  12:35 Найти цитируемый пост)
Во-первых раз тема в этом разделе, то ненадо давать советов, что лучше использовать beginthreadex вместо CreateThread, Windows тут ни при чём.

Тебя вот забыл спросить. Просто не дождался.

Цитата(asd @  4.6.2009,  12:35 Найти цитируемый пост)
Во-втиорых каким образом в уничтожении потока нам поможет WaitForSingleObject совершенно не ясно, разве что хендл прикрыть по его завершении. Но если он не нужен, то лучше вызвать CloseHandle сразу после CreateThread.

RTFM

Цитата(asd @  4.6.2009,  12:35 Найти цитируемый пост)
неплохо бы разобраться, что человеку нужно.

Тебя не проведешь. Это ты у нас гений. 

Цитата(asd @  4.6.2009,  12:35 Найти цитируемый пост)
По крайней мере я не вижу никакой, кроме того, что при ExitThread(ExitStatus) можно стек вернуть на в том состоянии, в котором он был на входе в поток.

Кого волнует что ты видишь?

PM MAIL   Вверх
asd
Дата 4.6.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: 1
Всего: 1



mrbrooks
Однако, а хоть 1 аргумент? И по поводу чего мне идти доки читать?
PM MAIL   Вверх
GremlinProg
Дата 4.6.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(asd @  4.6.2009,  14:35 Найти цитируемый пост)
В третьих, если поток создаётся с помощбю CreateThread, то почти никакой разницы между return ExitStatus и ExitThread(ExitStatus) нет. По крайней мере я не вижу никакой, кроме того, что при ExitThread(ExitStatus) можно стек вернуть на в том состоянии, в котором он был на входе в поток.

вообще-то разница может быть довольно значительной:

Код

DWORD Routine(...){
...
ExitThread(S_OK);
...
return S_OK;
}

DWORD WINAPI ThreadProc(LPVOID){
....
// распределяем какие-то данные, устанавливаем флаги активности и т.п.
...
rv = MainRoutine(...);
...
// освобождаем какие-то данные, сбрасываем флаги активности и т.п.
...
return rv;
}

ExitThread в этом случае просто завершит поток, при этом, восстановление стека совсем не означает, что все необходимые данные будут освобождены, и уж тем более, сброшены какие-либо внутренние флаги активности (т.е. необходимые действия после 12 строки)

мозгом тут нужно думать независимо от того, надо ли ждать завершения потока или нет


M
GremlinProg

mrbrooks, asd,
спокойствие,
страшного пока ни чего не случилось



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
mrbrooks
Дата 4.6.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



asd, дорогой друг.
1. Желательное использование beginthreadex/endthreadex в Windows при программировании на С++ не плод моей фантазии. Это совет г-на Рихтера. 
2. Цитата - взята у того же г-на Рихтера по средствам копирования/вставки через буфер обмена.
3. WaitForSingleObject позволяет узнать завершился ли поток или нет. Подробности тут. И опять таки - см. г-на Рихтера. 

Я конечно понимаю что ты офигенно классный парень - но уж если начинаешь поучать то бей аргументами - а не то, что там тебе кажется или видится.

Добавлено через 1 минуту и 18 секунд
GremlinProg, да все вроде ок  smile просто спорим.
PM MAIL   Вверх
bugmenot
Дата 4.6.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 3.7.2006

Репутация: 0
Всего: 1



Цитата(GremlinProg @  4.6.2009,  12:56 Найти цитируемый пост)
вообще-то разница может быть довольно значительной:

Я не совсем понял эту разницу, но вот что я знаю наверняка:
При return-е, функция возвращается в kernel32.dll, а там сразу вызывается тот же ExitThread.

Цитата(mrbrooks @  4.6.2009,  13:00 Найти цитируемый пост)
1. Желательное использование beginthreadex/endthreadex в Windows при программировании на С++ не плод моей фантазии. Это совет г-на Рихтера. 

Не все люди пишут на С++, я например на С пишу.

Цитата(mrbrooks @  4.6.2009,  13:00 Найти цитируемый пост)
3. WaitForSingleObject позволяет узнать завершился ли поток или нет. Подробности тут. И опять таки - см. г-на Рихтера. 

WaitForSingleObject, как подсказывает название, ждет, пока завершится поток или закончится таймаут. Чтобы узнать, завершился ли поток, лучше наверно воспользоваться GetExitCodeThread.

Цитата(asd @  4.6.2009,  12:35 Найти цитируемый пост)
т.е. слушай, что сказал  bugmenot.

Да, слушайте меня! smile
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
asd
Дата 4.6.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: 1
Всего: 1



Цитата(GremlinProg @  4.6.2009,  12:56 Найти цитируемый пост)
ExitThread в этом случае просто завершит поток, при этом, восстановление стека совсем не означает, что все необходимые данные будут освобождены, и уж тем более, сброшены какие-либо внутренние флаги активности (т.е. необходимые действия после 12 строки)

Стоп. ExitThread, естественно, надо вызывать, когда ф-ия потока уже всё освободила и сделала всё что нужно. Фактически я говорю об идентичности 
return rv; 
и 
ExitThread(rv);
если этот поток был создан через CreateThread, ибо после return ExitStatus мы попадаем на

Код

push eax
call ExitThread


В вашем коде 
rv = MainRoutine(...);
это вызов
DWORD Routine(...) ?
если так, то ясно, что так вызывать ExitThread нельзя.


mrbrooks, 
Всё это конечно хорошо, если мы пишем на с++ с использованием rtl. Раз тема находится в этом разделе и человек вызывает CreateThread, то я думаю, что пишет он на винапи. А мешать Винапи и beginthreadex/endthreadex бессмысленно. Если вы почитаете Рихтера внимательнее, то увидите, что он рекомендует вызавать beginthreadex/endthreadex по причинам, которые никак с виндой не связанны.


Цитата(mrbrooks @  4.6.2009,  13:00 Найти цитируемый пост)
WaitForSingleObject позволяет узнать завершился ли поток или нет.

что делает WaitForSingleObject мне известно. Только проблема состоит в том, что.
Цитата(Graf_h @  3.6.2009,  18:28 Найти цитируемый пост)
По идее он должен сам убится, когда функция возвращает 0, но у меня он и дальше висит:(

И вот вопрос, зачем вызывать WaitForSingleObject? И чем он нам может почочь?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.