Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CExFileDialog


Автор: mrgloom 17.6.2011, 11:27
при использовании CExFileDialog и открытии файла который долго парсится приложение "залипает" и диалог стоит открытый, а хотелось бы сделать так чтобы приложение пусть даже и замирало,но диалог закрывался и был прогресс бар загрузки. 

Автор: Earnest 20.6.2011, 07:38
А не начинай открывать файл до того, как закроешь диалог. Просто запомни имя в какой-то переменной, закрой, а потом уже загружай файл. А чтобы был прогресс, нужно его сделать. Сам он точно не нарисуется.
Логичнее всего читать файл в потоке, функция чтения должна после каждого блока (строки или чего там читается) сообщать свой прогресс. А главный поток должен этот прогресс отображать на соответствующем контроле. Можно сделать то же самое и в одном потоке, но это коряво.

Автор: RastaDja 21.6.2011, 15:01
Цитата(Earnest @  20.6.2011,  08:38 Найти цитируемый пост)
Логичнее всего читать файл в потоке, функция чтения должна после каждого блока (строки или чего там читается) сообщать свой прогресс.

Такие танцы занимают много времени (именно вычисление процентов загрузки). Лучше прогрессбар без процентов - просто бегущая строка (если это не условие разработки).

Автор: Earnest 21.6.2011, 16:26
А чего вдруг она бежать будет, если ты ей текущий процент не скажешь? Что бы под этим не понималось.
А насчет вычисления процента загрузки - да чего же тут сложного и долгого? Например, сойдет отношение текущей позиции в читаемом файле к его объему.

Автор: RastaDja 22.6.2011, 08:05
Цитата(Earnest @  21.6.2011,  17:26 Найти цитируемый пост)
А чего вдруг она бежать будет, если ты ей текущий процент не скажешь

все зависит от прогрессбара, не знаю есть ли в MFC такой (не проверял). В своё время делал подобную вещь на .net, там в прогрессбара было свойство (не помню какое), в котором можно было указать - отображать бегущую строку вместо процентов загрузки.

Автор: Earnest 22.6.2011, 08:41
В MFC такого нет, насколько я знаю. Это ведь просто обертка над системным контролом.
Но не уверена, возможно, в новых Виндусах и докрутили.
С другой стороны, это элементарно сделать: на идл или на таймер вешаешь обработчик, который инкрементирует текущую позицию (если я правильно поняла, ты имеешь в виду полоску, которая просто по кругу бегает несколько раз).
Однако с третьей стороны, толку от такого прогресс-бара никакого. Ровно то же показывают просто песочные часы: типа процесс идет, а сколько еще ждать - хз. А может все давно зависло. Так что я все же напряглась бы и сделала нормальный подсчет прогресса, тем более что это нетрудно. Даже если процесс обрабатывает данные не поступательно (т.е. может возвращаться к данным по несколько раз), можно примерно прикинуть таки прогресс. А уж в поступательном процессе - вообще нет проблем.

Автор: RastaDja 22.6.2011, 09:53
Цитата(Earnest @  22.6.2011,  09:41 Найти цитируемый пост)
Так что я все же напряглась бы и сделала нормальный подсчет прогресса, тем более что это нетрудно.

Все зависит от того как Вы грузите файл, и что это за файл. Например, у Вас xml файл который грузится через какой-то объект, и допустим этот объект может лишь сообщить об окончании загрузки, либо вообще никак не сообщить (в лучшем случае вернет true из метода load). Как тут прикручивать прогресс...? Метод подсчета размера, это действует для текстовых файлов, или файлов известного зарание формата (в том случае если вы парсите его в ручную).

Автор: Earnest 22.6.2011, 10:08
С этим не поспоришь. Я предполагала, что либо ты читаешь сам, либо есть возможность влезть в тот код, который читает.
Но парсеров xml гораздо больше одного. Я уж не говорю о том, что исходного кода тоже достаточно, и ничего сверх-сложного там нет. 
Раз твой объект не позволяет получить нужную информацию, то либо он подходит только для чтения малых файлов, либо ты чего-то не нашел.
Если уверен в своем диагнозе (не имеет нужных точек входа), то решение очевидно: меняй парсер.

Автор: RastaDja 22.6.2011, 11:09
Цитата(Earnest @  22.6.2011,  11:08 Найти цитируемый пост)
Но парсеров xml гораздо больше одного. Я уж не говорю о том, что исходного кода тоже достаточно, и ничего сверх-сложного там нет. 

Это действительно так. Но есть случаи - у меня такой был - когда используется не парсер, а объект, который умеет сериализовать себя в xml. И данных он хранил достаточно много (он хранил таблицу). Лезть в код объекта... (это, к тому же dll) имхо не нужно.
   Но всеже у вас хорошие аргументы, поэтому плюсую + smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)