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

Поиск:

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


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


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

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



Цитата(bugmenot @  4.6.2009,  13:23 Найти цитируемый пост)
Не все люди пишут на С++, я например на С пишу.

Резонно  smile 
Цитата(bugmenot @  4.6.2009,  13:23 Найти цитируемый пост)
WaitForSingleObject, как подсказывает название, ждет, пока завершится поток или закончится таймаут. Чтобы узнать, завершился ли поток, лучше наверно воспользоваться GetExitCodeThread.

Согласен. Только имхо ее как раз и есть смысл вызвать после WaitForSingleObject или есть другие идеи. 

Цитата(asd @  4.6.2009,  13:23 Найти цитируемый пост)
Всё это конечно хорошо, если мы пишем на с++ с использованием rtl. 

Резонно.

Цитата(asd @  4.6.2009,  13:23 Найти цитируемый пост)
Если вы почитаете Рихтера внимательнее, то увидите, что он рекомендует вызавать beginthreadex/endthreadex по причинам, которые никак с виндой не связанны.

Согласен. Разговор шел о С++. 

Цитата(asd @  4.6.2009,  13:23 Найти цитируемый пост)
А мешать Винапи и beginthreadex/endthreadex бессмысленно.

не понял - почему же? можно по подробнее?



Цитата(asd @  4.6.2009,  13:23 Найти цитируемый пост)
И вот вопрос, зачем вызывать WaitForSingleObject? И чем он нам может почочь? 

Тем что функция возвращает. Я же не утверждаю что только так можно определить завершился ли поток (WAIT_OBJECT_0) или нет (WAIT_TIMEOUT) - но как вариант имхо вполне годится.

Добавлено через 2 минуты и 13 секунд
И соответственно принимаем решения в зависимости от результата.
PM MAIL   Вверх
GremlinProg
Дата 4.6.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asd @  4.6.2009,  15:23 Найти цитируемый пост)

В вашем коде rv = MainRoutine(...);это вызов
DWORD Routine(...) ?

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

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



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


Шустрый
*


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

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



Цитата(mrbrooks @  4.6.2009,  13:36 Найти цитируемый пост)
не понял - почему же? можно по подробнее?

Если мешать вызовы rtl и винапи, то рано или поздно произойдёт нечто подобное тому, что описывает Рихтер в разделе "Ой, вместо _beginthreadex я по ошибке вызвал CreateThread". И не факт, что это единственный такой пример.


Цитата(mrbrooks @  4.6.2009,  13:36 Найти цитируемый пост)
Тем что функция возвращает. Я же не утверждаю что только так можно определить завершился ли поток (WAIT_OBJECT_0) или нет (WAIT_TIMEOUT) - но как вариант имхо вполне годится.

Так вопрос состоит не в том, чтобы определить, завершился ли поток, а в том, _почему_ он висит после return 0;



Цитата(mrbrooks @  4.6.2009,  13:36 Найти цитируемый пост)
Согласен. Только имхо ее как раз и есть смысл вызвать после WaitForSingleObject или есть другие идеи. 

Зачем вам 2 перехода в ядро вместо 1? Wait.. ф-ии стоит вызывать, если нам нужно именно _дождаться_ завершения потока(к примеру он готовит какие-то данные для нас)

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


Эксперт
****


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

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



Цитата(mrbrooks @  4.6.2009,  15:36 Найти цитируемый пост)
Тем что функция возвращает. Я же не утверждаю что только так можно определить завершился ли поток (WAIT_OBJECT_0) или нет (WAIT_TIMEOUT) - но как вариант имхо вполне годится.

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


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


Шустрый
*


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

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



Цитата(GremlinProg @  4.6.2009,  13:49 Найти цитируемый пост)
вызвать можно, но логика работы потока уже будет путаной

Ну это уже мазахизмsmile

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


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


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

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



Цитата(GremlinProg @  4.6.2009,  13:59 Найти цитируемый пост)
Wait дает возможность дождаться завершения, но завершить, конечно не дает 

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


Цитата(asd @  4.6.2009,  13:53 Найти цитируемый пост)
Так вопрос состоит не в том, чтобы определить, завершился ли поток, а в том, _почему_ он висит после return 0;

Ок. А как было определено что поток повис именно после return 0?

Добавлено через 3 минуты и 36 секунд
Цитата(asd @  4.6.2009,  13:53 Найти цитируемый пост)
Если мешать вызовы rtl и винапи, то рано или поздно произойдёт нечто подобное тому, что описывает Рихтер в разделе "Ой, вместо _beginthreadex я по ошибке вызвал CreateThread". И не факт, что это единственный такой пример.

сейчас пробежал глазами  - ничего ужасного супротив  _beginthreadex обнаружено не было.

Добавлено через 6 минут и 45 секунд
Цитата(asd @  4.6.2009,  13:53 Найти цитируемый пост)
Если мешать вызовы rtl и винапи, то рано или поздно произойдёт нечто подобное тому, что описывает Рихтер в разделе "Ой, вместо _beginthreadex я по ошибке вызвал CreateThread". И не факт, что это единственный такой пример.

сейчас пробежал глазами  - ничего ужасного супротив  _beginthreadex обнаружено не было.
PM MAIL   Вверх
asd
Дата 4.6.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mrbrooks @  4.6.2009,  14:07 Найти цитируемый пост)
Ок. А как было определено что поток повис именно после return 0?

Это сказал топикстартер.

Цитата(mrbrooks @  4.6.2009,  14:07 Найти цитируемый пост)
сейчас пробежал глазами  - ничего ужасного супротив  _beginthreadex обнаружено не было.

Да дело на в _beginthreadex. У рихтера описан вариант вызова библиотечной ф-ии в потоке созданном через CreateThread. И кто сказал что подобных вещей не может произойти, если мы начнём совмещать другие вызовы  trl с вызовами других АПИ
PM MAIL   Вверх
mrbrooks
Дата 4.6.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(asd @  4.6.2009,  14:19 Найти цитируемый пост)
Это сказал топикстартер.

Точно. Вопрос переадресуем  ему.


Цитата(asd @  4.6.2009,  14:19 Найти цитируемый пост)
Да дело на в _beginthreadex. У рихтера описан вариант вызова библиотечной ф-ии в потоке созданном через CreateThread. И кто сказал что подобных вещей не может произойти, если мы начнём совмещать другие вызовы  trl с вызовами других АПИ 

Волков боятся - в лес не ходить. smile 
Хотя ситуацию надо обмозговать.
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.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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