Поиск:

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


Новичок



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

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



Привет.

MFC. Загрузка файла. SDI приложение. Входной файл достаточно сложный и надо выводить что-то навроде репорта о его загрузки. Захотел сделать модальный диалог с окошком рапорта, но вот дурацкая проблема - надо знать когда отрисовался диалог для начала парсинга файла, может какое сообщение есть? 
Или костыль ставить в виде треда - и там проверять IsWin...(диалог) и посылать пользоват. сообщение о том что типа можно начать парсить? Что-то короче не ясно мне.

Гуру от MFC, я знаю вы еще остались, отзовитесь.

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(mbedreal @  26.4.2013,  14:22 Найти цитируемый пост)
надо знать когда отрисовался диалог для начала парсинга файла,

А зачем? Зачем связывать начало парсинга с созданием диалога? Это разные задачи, пусть работают независимо.

Если файл читается долго, а ты хочешь протокол загрузки, то файл надо читать в потоке, по ходу чтения бросать в лог строки. Под логом я в данный момент понимаю что-то вроде очереди (строк). А диалог на идле (или по таймеру) пусть заглядывает в очередь, извлекает строки и печатает их в текстовом окне.

Если файл читается достаточно быстро, но просто по ходу дела могут возникнуть всяческие замечания, и их надо бы отобразить, то вообще нечего париться: по мере чтения накапливай строки в массиве строк или в едином строковом буфере, а потом по завершении выведи.

А вообще-то есть сообщение WM_INITDIALOG, в MFC - виртуальный метод OnInitDialog, начиная с которого окно уже есть и ты можешь его ковырять. Но оно необязательно будет видимо в этот момент.


--------------------
...
PM   Вверх
mbedreal
Дата 27.4.2013, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @ 26.4.2013,  18:11)
Цитата(mbedreal @  26.4.2013,  14:22 Найти цитируемый пост)
надо знать когда отрисовался диалог для начала парсинга файла,

А зачем? Зачем связывать начало парсинга с созданием диалога? Это разные задачи, пусть работают независимо.

Если файл читается долго, а ты хочешь протокол загрузки, то файл надо читать в потоке, по ходу чтения бросать в лог строки. Под логом я в данный момент понимаю что-то вроде очереди (строк). А диалог на идле (или по таймеру) пусть заглядывает в очередь, извлекает строки и печатает их в текстовом окне.

Если файл читается достаточно быстро, но просто по ходу дела могут возникнуть всяческие замечания, и их надо бы отобразить, то вообще нечего париться: по мере чтения накапливай строки в массиве строк или в едином строковом буфере, а потом по завершении выведи.

А вообще-то есть сообщение WM_INITDIALOG, в MFC - виртуальный метод OnInitDialog, начиная с которого окно уже есть и ты можешь его ковырять. Но оно необязательно будет видимо в этот момент.

Ну на диалоге прогресс бар, и начало парсинга обязательно нужно связать с фактом видимости диалога, иначе весь смысл теряется. Виртуальный метод OnInitDialog я попробывал сразу, окно еще не отрисовано при его вызове. Даже если в нем сделать вызов  ShowWindow(SW_SHOW) отображается диалог не корректно.
Делать поток для загрузки тоже смысла нет, пользователю все равно надо ждать завершения обработки.
Просто хотелось сделать класс диалога CDlgLoadFile, в нем сделать сериализацию и вызывать его модально. 
Ладно, что нибудь придумаю.

PM MAIL   Вверх
Earnest
Дата 29.4.2013, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Поток запускается не обязательно для того, чтобы "не ждать". Это очень удобный инструмент. Но если хочешь синхронно - не вопрос.
Сделай так: из OnInitDialog пошли асинхронно сам себе (т.е. диалогу) какое-нибудь сообщение  (WM_USER + ...) или команды - что угодно, но обязательно PostMessage.
Как поймаешь, можешь запускать чтение.
Есть еще сообщение WM_ENTERIDLE (или что-то в этом роде). Оно посылается когда диалог входит в цикл простоя - т.е. первый раз, когда все отрисовано. Но я не уверена, что всем диалогам. А, может, диалогам посылается WM_KICKIDLE, точно не помню. 
Короче, я бы делала через посылку самому себе сообщения.



--------------------
...
PM   Вверх
mbedreal
Дата 30.4.2013, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Отсылка юзерного сообщения самому себе неплохая идея, возьму на вооружение. Как то и не думал что так можно решать некоторые вопросы. smile 

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

По ходу вылез не понятный пока баг, на основе входного файла создаются списки для OpenGl, так вот в треде списки создаются - но при возврате в главное окно они пусты (???) - пришлось вынести создание списков за тред, пока не знаю в чем дело - благо списки создаются почти моментально по сравнению с парсингом. Возможно так воздействует EnableWin..(..) для главного окна, потом при сопровождении буду разбираться.


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Не знаю, что такое "списки для OpenGL", но не думаю, что они как-то зависят от EnableWin.
Может, ты переменную потока объявил? Хотя не представляю, как это можно сделать нечаянно... Или еще какая-то фигня с передачей параметров...



--------------------
...
PM   Вверх
mbedreal
Дата 7.5.2013, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Не знаю, что такое "списки для OpenGL", но не думаю, что они как-то зависят от EnableWin.
Может, ты переменную потока объявил? Хотя не представляю, как это можно сделать нечаянно... Или еще какая-то фигня с передачей параметров...


Списки opengl это типа - последовательность команд для отрисовки какой либо фигуры для этого движка, списков таких можно сделать много, отрисовываются они движком очень быстро. Вообще OpenGl это такой глобальный автомат состояний, программить его достаточно просто. Почему пусты списки не понятно - вроде двигатель глобальный должен быть, т.е. доступный из любого места программы.

Про переменную потока - нет, я таких ошибок не могу не заметить.

Насчет передачи параметров. Правильно ли я сделал что в классе модального диалога обрабатывающего входной файл используется просто указатель на класс объекта документа, который имеет функции по парсингу этого файла и еще передается указатель на CArhive?
Может надо по другому как то делать?

 

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(mbedreal @  7.5.2013,  10:50 Найти цитируемый пост)
 Правильно ли я сделал

Да какая разница? В том смысле, что концептуально это не очень, интерфейс с логикой смешивать, но источник ошибки вряд ли здесь, разве что ты с параметрами что-то напутал. Не понимаю, чего тут гадать-то. Дебажь. Может, у тебя тупо переменные разные, а ты думаешь , что одна.... Да мало ли какие косяки бывают.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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