![]() |
|
![]() ![]() ![]() |
|
mbedreal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 26.4.2013 Репутация: нет Всего: нет |
Привет.
MFC. Загрузка файла. SDI приложение. Входной файл достаточно сложный и надо выводить что-то навроде репорта о его загрузки. Захотел сделать модальный диалог с окошком рапорта, но вот дурацкая проблема - надо знать когда отрисовался диалог для начала парсинга файла, может какое сообщение есть? Или костыль ставить в виде треда - и там проверять IsWin...(диалог) и посылать пользоват. сообщение о том что типа можно начать парсить? Что-то короче не ясно мне. Гуру от MFC, я знаю вы еще остались, отзовитесь. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А зачем? Зачем связывать начало парсинга с созданием диалога? Это разные задачи, пусть работают независимо. Если файл читается долго, а ты хочешь протокол загрузки, то файл надо читать в потоке, по ходу чтения бросать в лог строки. Под логом я в данный момент понимаю что-то вроде очереди (строк). А диалог на идле (или по таймеру) пусть заглядывает в очередь, извлекает строки и печатает их в текстовом окне. Если файл читается достаточно быстро, но просто по ходу дела могут возникнуть всяческие замечания, и их надо бы отобразить, то вообще нечего париться: по мере чтения накапливай строки в массиве строк или в едином строковом буфере, а потом по завершении выведи. А вообще-то есть сообщение WM_INITDIALOG, в MFC - виртуальный метод OnInitDialog, начиная с которого окно уже есть и ты можешь его ковырять. Но оно необязательно будет видимо в этот момент. -------------------- ... |
|||
|
||||
mbedreal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 26.4.2013 Репутация: нет Всего: нет |
Ну на диалоге прогресс бар, и начало парсинга обязательно нужно связать с фактом видимости диалога, иначе весь смысл теряется. Виртуальный метод OnInitDialog я попробывал сразу, окно еще не отрисовано при его вызове. Даже если в нем сделать вызов ShowWindow(SW_SHOW) отображается диалог не корректно. Делать поток для загрузки тоже смысла нет, пользователю все равно надо ждать завершения обработки. Просто хотелось сделать класс диалога CDlgLoadFile, в нем сделать сериализацию и вызывать его модально. Ладно, что нибудь придумаю. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Поток запускается не обязательно для того, чтобы "не ждать". Это очень удобный инструмент. Но если хочешь синхронно - не вопрос.
Сделай так: из OnInitDialog пошли асинхронно сам себе (т.е. диалогу) какое-нибудь сообщение (WM_USER + ...) или команды - что угодно, но обязательно PostMessage. Как поймаешь, можешь запускать чтение. Есть еще сообщение WM_ENTERIDLE (или что-то в этом роде). Оно посылается когда диалог входит в цикл простоя - т.е. первый раз, когда все отрисовано. Но я не уверена, что всем диалогам. А, может, диалогам посылается WM_KICKIDLE, точно не помню. Короче, я бы делала через посылку самому себе сообщения. -------------------- ... |
|||
|
||||
mbedreal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 26.4.2013 Репутация: нет Всего: нет |
Отсылка юзерного сообщения самому себе неплохая идея, возьму на вооружение. Как то и не думал что так можно решать некоторые вопросы.
![]() Я сделал все же по стандартному, как и было вами предложено - модальный диалог запускает тред, тот в вектор бросает логи и дергает через пользовательское сообщение диалог о изменении прогресса и увеличения записей виртуального списка, ну все как обычно - код оказался достаточно прозрачным. По ходу вылез не понятный пока баг, на основе входного файла создаются списки для OpenGl, так вот в треде списки создаются - но при возврате в главное окно они пусты (???) - пришлось вынести создание списков за тред, пока не знаю в чем дело - благо списки создаются почти моментально по сравнению с парсингом. Возможно так воздействует EnableWin..(..) для главного окна, потом при сопровождении буду разбираться. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не знаю, что такое "списки для OpenGL", но не думаю, что они как-то зависят от EnableWin.
Может, ты переменную потока объявил? Хотя не представляю, как это можно сделать нечаянно... Или еще какая-то фигня с передачей параметров... -------------------- ... |
|||
|
||||
mbedreal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 26.4.2013 Репутация: нет Всего: нет |
Списки opengl это типа - последовательность команд для отрисовки какой либо фигуры для этого движка, списков таких можно сделать много, отрисовываются они движком очень быстро. Вообще OpenGl это такой глобальный автомат состояний, программить его достаточно просто. Почему пусты списки не понятно - вроде двигатель глобальный должен быть, т.е. доступный из любого места программы. Про переменную потока - нет, я таких ошибок не могу не заметить. Насчет передачи параметров. Правильно ли я сделал что в классе модального диалога обрабатывающего входной файл используется просто указатель на класс объекта документа, который имеет функции по парсингу этого файла и еще передается указатель на CArhive? Может надо по другому как то делать? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да какая разница? В том смысле, что концептуально это не очень, интерфейс с логикой смешивать, но источник ошибки вряд ли здесь, разве что ты с параметрами что-то напутал. Не понимаю, чего тут гадать-то. Дебажь. Может, у тебя тупо переменные разные, а ты думаешь , что одна.... Да мало ли какие косяки бывают. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |