![]() |
|
![]() ![]() ![]() |
|
harimambura |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 9.8.2012 Где: минск Репутация: нет Всего: нет |
Здравствуйте, форумчане.
Очень нуждаюсь в вашей помощи. вобщем вопрос следующий: необходимо в отдельном потоке отобразить окно диалога модально, при этом из основного потока использовать функции, описанные в классе этого диалога. пробую делать так (общий вид кода, только основа):
в хедере описан CWinThread* pThread; но после того, как поток запустился, на первой же функции InfoDlg->InitProgress2(1,12); бьет ошибку "an invalid argument was encountered", это в релизе, а в дебаге "Debug Assertion filed! file: f:\sp\vctools\vc7libs\ship\atlmfc\include\afxcmn.inl line:461". далее выполнение функции myfunc обрывается, хоть диалог и отображается. Что не так? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не получится в рабочем потоке (как у тебя) запустить диалог. Ну то есть полноценно не получится. Диалогу, как и любому окну, нужен поток с циклом обработки сообщений.
Кроме того, обращаться к диалогу из другого потока тоже нехорошо, MFC такого не любит. Можно обращаться через сообщения, но не напрямую. Если задача учебная, то совершенно дурацкая. -------------------- ... |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Насколько я могу судить, речь идет о диалоге хода выполнения некоторой задачи. И пусть конечно нехорошо запускать диалог в потоке, но вполне возможно.
Ошибка скорее всего вылазит потому, что сам диалог еще не успел "оформиться как окно", а вы ему уже функции дергаете. Для теста поставьте банальный Sleep(1000) после
если все будет нормально, то просто нужно будет реализовать механизм ожидания (может быть подойдет WaitForInputIdle) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не "нехорошо", а нельзя. В Виндоус окно обрабатывает сообщения в своем потоке, и поток этот должен быть интерфейсным, т.е. иметь цикл обработки сообщений. Просто запустить диалог из рабочего потока, но который будет тем не менее работать в главном (или другом интерфейсном), можно, наверное, но криво очень. Описанная задача (т.е. запуск диалога, который отмечает ход рабочего потока) совсем не нуждается в этой кривоте. Диалог запускается в нормальном (главном) потоке, получает сообщения из рабочего и меняет прогресс. Вот и все. Можно сделать так, что рабочий поток по мере работы будет посылать 3 вида сообщений: я стартовал (запускайте диалог прогресса), текущий прогресс такой-то (обновите прогресс), я закончил с таким-то результатом. И никакой кривоты. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |