![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mrgloom |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
такое ощущение, что WaitForSingleObject в основном процессе блокирует выполнение кода в созданном треде.
т.е. я например делаю
хочу чтобы тред остановился ,а тред должен выставить ивент когда закончится.
и ожидаю
или так
но такое ощущение, что в треде после вызова WaitForSingleObject ничего не происходит вообще, т.е. это даже не связано с ивентами, пробовал даже левый тестовый ивент- результат тот же.
причем если WaitForSingleObject убрать, то в тред нормально заходит и ::SetEvent(m_StopThread); и условие тоже нормально схватывает. но мне надо не просто отправить команду треду завершится но еще и подождать пока завершится тред. |
||||||||||
|
|||||||||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
(std|boost)::thread и не пишите платформозависимый код.
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
у WaitForSingleObject второй параметр - время ожидания. Вам, по видимому туда надо передавать константу INFINITE. Если передается 0, то WaitForSingleObject ничего не ждет, а сразу возвращает текущее состояние.
Однако хотелось бы увидеть возвращаемое значение, Вы его нигде не анализируете, а оно может быть разным. Например WAIT_FAILED. Были ли m_StopThread и m_WaitThread созданы при помощи CreateEvent() ? |
|||
|
||||
| mrgloom |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
я и так пробовал,
так дело в том что значения и не возвращается ,а просто висит всё на этой функции.
ага
в бусте, что то не нашел аналога ивенту и для завершения там только .join? у меня там в треде цикл и надо его прервать на очередной итерации записав текущее переменные. Это сообщение отредактировал(а) mrgloom - 9.7.2012, 15:35 |
||||||||
|
|||||||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
std::atomic в помощь. Делаете, скажем, булевую переменную - выставляете ее в true, если надо прервать. В цикле в потоке проверяете ее.
|
|||
|
||||
| mrgloom |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
попробовал буст+ булевые переменные в классе
так запускаю
так останавливаю
в теле треда
и всё равно на while(!m_WaitThread) всё виснет и в треде почему то ничего не выполняется. Добавлено @ 16:49 не заметил ответа, пока писал. std::atomic? в каких то источниках пишут еще volatile bool, а простая булевая переменная таит в себе какие то опастности? Добавлено @ 16:58 попробовал volatile bool результат тот же. а std::atomic это же что то новое как и std::thread, не? Это сообщение отредактировал(а) mrgloom - 9.7.2012, 16:59 |
||||||
|
|||||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Честно говоря, так не делается. Ибо тред выставляет ивент и на этом не заканчивается. Например, если поток вызван из подключенной dll, а Вы по состоянию события решаете, что поток завершился и отключаете dll от процесса, то велика вероятность получить нарушение доступа. Дескриптор потока - тоже синхронизирующий объект, поэтому вполне можно его ожидать:
Я не понял, какой именно... Да и вообще не понятно, что происходит в программе (в основном потоке и в созданном). У Вас есть возможность сбрасывать логи, так почему бы ей не воспользоваться? Вставьте в проблемные части кода немного выдачи, да проанализируйте её... Я вот, например, не уверен, что
хоть когда-нибудь вернёт WAIT_OBJECT_0.... А если возвращает, то почему не выдаёт ??? Или выдаёт? Короче, нужны подробности, ничего не ясно... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| mrgloom |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну да можно без ивента
попробовал так. постоянно WAIT_TIMEOUT, в теле треда никакой активности.
я выше написал как вызываю, есть кнопка на форме старт и пауза, на старт тред начинает исполнение, на паузу выставляется ивент остановить тред, который на каждой итерации в цикле треда проверяется, потом надо дождатся когда тред закончится и вот тут то и вылезает проблема, т.к. всё зависает на WaitForSingleObject. может это как то связано с формой? или ивент каким то образом лочится? причем если без WaitForSingleObject, то ивент в треде нормально определяется и тред завершается, только получается основной поток его не ждет. Добавлено через 14 минут и 45 секунд хммм попробовал
и в тред управление приходит только после выполнения слипа, а то и вообще после выполнения всего кода по кнопке пауза, т.е. такое ощущение, что приоритет у основного треда выше и управление не передается. Это сообщение отредактировал(а) mrgloom - 10.7.2012, 09:36 |
||||||
|
|||||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
попробовал так, всё тоже самое, изменение приоритета не помогает.
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
запустите такую программку
result в обоих случаях должен быть равным 0 (это и есть WAIT_OBJECT_0) |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
попробовал
и всё сработало и меня натолкнуло на мысль а не попробовать ли CControlDlg::GetFrame без класса и попробовал и оно заработало ,а теперь остается вопрос, почему когда функция внутри класса, то она не работает? может это связано с тем что если объявлять в классе, то для передачи в AfxBeginThread её надо объявлять как static? а может заработало потому что я ивенты объявил глобально, а не в классе? функция CControlDlg::GetFrame сейчас там просто цикл с слипом для тестирования, типа имитация работы, начальное значения от куда начинать цикл берется из класса. Это сообщение отредактировал(а) mrgloom - 10.7.2012, 12:59 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
CControlDlg::GetFrame вызывалась без объекта? тогда просто повезло, что оно не плюхнулось.
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Если функция описана внутри класса, то она неявно имеет ещё один аргумент. В результате
превращается в
Вызывалось, так как первым аргументом AfxBeginThread шла функция, а в этом случае AfxBeginThread не знает, что она из какого-то класса... Компилятор, кстати, должен бы выдать предупреждение... Это сообщение отредактировал(а) feodorv - 10.7.2012, 13:30 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну и какой из этого вывод?
так я ж говорю ,что AfxBeginThread ест только статик, когда передаешь функцию из класса, а статик функцию вроде как можно и без объекта вызывать. хотя, если функция не из класса можно и не статик её передавать. Это сообщение отредактировал(а) mrgloom - 10.7.2012, 15:55 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |