Название: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: AD от Сентябрь 28, 2009, 15:16 Я когда-то задавал подобный вопрос, приемлемого решения не нашлось на тот момент. Но теперь проблема стала снова и серьезно.
Дело в том, что при использовании функции getOpenFileName в стандартном виде: Код То эта функция лезет в сетевое окружение. Если сервер сети в данный момент не работает, то вывод окошка замедляется, а то и совсем зависает. Дело в том, что программа начинают с выбора загружаемых лог-файлов, а соответственно с этого окна. Но если сервера (и основной и резервный) в данный момент недоступны, то прога зависает и это окошко не появляется. Какими флагами, шаманствами и прочим можно заставить эту функцию не лезть в сетевое окружение??? Сделал для функций следующие обертки. Не особо помогло. Чуть быстрее открывается, но задержка есть. Пока полного зависания не наблюдалось, но задержка раздражает: Код
Код Не слишком помогло. Буду благодарен за помощь!!! Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: shadone от Сентябрь 29, 2009, 12:19 QFileDialog::getOpenFileName показывает родной диалог открытия файлов. Вряд ли тут что-то можно сделать. Я так понимаю точно также "тормозят" любые другие (не-Qt) приложения показывающие родные диалоги?
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: BaltikS от Сентябрь 29, 2009, 12:21 Можно ещё предложить пингануть сервак перед открытием окошка.... :)
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: lit-uriy от Сентябрь 29, 2009, 16:21 >>Можно ещё предложить пингануть сервак перед открытием окошка....
А толку-то, ну отвалилися он, а окошко-то всё равно открывать. Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: BaltikS от Сентябрь 29, 2009, 18:00 >>Можно ещё предложить пингануть сервак перед открытием окошка.... Я так понял она как раз таки с сервака и открывает файлы....А толку-то, ну отвалилися он, а окошко-то всё равно открывать. Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: lit-uriy от Сентябрь 29, 2009, 18:11 Нет, просто из-за сетевого окружения, диалог открытия файлов задумывается
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: AD от Сентябрь 29, 2009, 21:11 QFileDialog::getOpenFileName показывает родной диалог открытия файлов. Вряд ли тут что-то можно сделать. Я так понимаю точно также "тормозят" любые другие (не-Qt) приложения показывающие родные диалоги? Да, тормозят. По крайней мере, MFC-шное тоже задумывается... Так использую неродное уже ведь. Использую Qt-шное....Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: BlackTass от Сентябрь 30, 2009, 07:51 дак Qt то в свою очередь использует родной диалог)
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: CroCIV от Сентябрь 30, 2009, 07:54 Почитай про уровни модели OSI тебе все станет понятнее http://www.citforum.ru/nets/switche/osi.shtml . Таким образом и Qt и любое другое не мелокмягкое решение будет тормозить, если, конечно, оно не работает сразу на 3-4 уровне OSI. На сколько я знаю есть у мелкомягких такая переменная управляющая временем ожидания ответа от сетевого интерфейса, но тут есть но, если в сети наблюдается систематический недоперепинг, то с коротким временем ожидания система вероятнее руганется об недоступности удаленного хоста, а он может и прощупался бы, еслиб подождали подольше. И вообще СаМБа - это зло. Помоему на виндовс 7 используется уже другой протокол, и мб там такой беды не будет.
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Сентябрь 30, 2009, 17:46 Думаю, что все-таки есть решение этой проблемы. Ведь не тормозит точно абсолютно такое же окошко, что при вызове статической функции getOpenFileNames(), при открытии нового документа Word, Excel! Только что проверил - моментальное открытие.
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 02, 2009, 16:20 Не удается найти решение. А просто как воздух необходимо...
Помогите, пожалуйста! Этот стандартный диалог в Word, Excel, Power Point открывается моментально - это ведь значит, что проблему можно вылечить? Уже весь ассистент перелистал в поисках решения... Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: shadone от Октябрь 02, 2009, 17:27 Не удается найти решение. А просто как воздух необходимо... Assistant ничем не поможет, особенно учитывая что диалог в MFC тоже тормозит при открытии. Решение я вижу только одно - найти как работают Word/Excel/etc, что они делают особенного что диалог открывается моментально и послать патч в Qt Development Frameworks который исправит проблему. Помогите, пожалуйста! Этот стандартный диалог в Word, Excel, Power Point открывается моментально - это ведь значит, что проблему можно вылечить? Уже весь ассистент перелистал в поисках решения... Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: Alp от Октябрь 03, 2009, 11:30 Думаю, что все-таки есть решение этой проблемы. Ведь не тормозит точно абсолютно такое же окошко, что при вызове статической функции getOpenFileNames(), при открытии нового документа Word, Excel! Только что проверил - моментальное открытие. К сожалению, нет офиса на компьютере, не могу проверить. Есть ли гарантия, что ворд/эксель открывают стандартный диалог выбора файла, а не реализуют его самостоятельно с тем же видом?Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: pastor от Октябрь 03, 2009, 11:35 Так использую неродное уже ведь. Использую Qt-шное.... Можешь отдебажить ход создания Qt-шного диалога и глянуть где проблема (метод, функция, этц). Код-то открыт Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: Igors от Октябрь 03, 2009, 12:43 Есть ли гарантия, что ворд/эксель открывают стандартный диалог выбора файла, а не реализуют его самостоятельно с тем же видом? Да, в отладчике можно увидеть как свора стандартных dll подгружается при открытии.У меня была проблема на слабенькой машине тормозил сетевой диск. Выкрутился отключив <filters>, пришлось открывать "anyFile". Хотя это может совсем не тот случай. Сочувствую. Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: AD от Октябрь 04, 2009, 23:31 Можешь отдебажить ход создания Qt-шного диалога и глянуть где проблема (метод, функция, этц). Код-то открыт Попробую. Правда, разобраться будет не очень легко. Куча кода с макросами... Но .... попробую....Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: Danila_Bagrofff от Октябрь 05, 2009, 07:07 А если вывести это в отдельный поток?... А поток можно оборвать по таймауту, если долго не открывается. Это хотя бы уберет зависание. Но с открытием, конечно, не поможет...
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: pastor от Октябрь 05, 2009, 13:10 А если вывести это в отдельный поток? С GUI нельзя работать в других потоках Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: Igors от Октябрь 05, 2009, 13:35 Еще один тест/зацепка: создать его в нативном коде и посмотреть/поэкспериментировать. В Вындоуз ::GetOpenFileName не так уж сложно
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 10:30 Полез в исходники QFileDialog
Некоторое, непродолжительное время (от 3 до 5 секунд (несмертельно, эти задержки незаметны в релизном режиме)) зависает при создании диалогового окна на функции init, а в ней на функции - restoreState Код Ну а далее основательно зависает на функции exec(), а в ней на строчках: Код
Как поправить данную проблему? Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: shadone от Октябрь 06, 2009, 11:24 Ну а далее основательно зависает на функции exec(), а в ней на строчках: Код
Как поправить данную проблему? Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 11:57 Ну он крутится внутри цикла
Код функции Код
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: shadone от Октябрь 06, 2009, 12:59 это цикл обработки сообщений (блокирующий, поэтому не нагружающий систему). проблема где-то глубже.
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: Igors от Октябрь 06, 2009, 13:10 Шагать отладчиком в цикле событий очень тяжело и результат не гарантирует (времена/таймауты при отладке совсем другие). Не хочу быть навязчивым, но сначала надо выяснить "чья" это проблема: Qt или Вындоуз, поэкспериметировав в нативном коде.
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 13:18 Цитировать Шагать отладчиком в цикле событий очень тяжело и результат не гарантирует (времена/таймауты при отладке совсем другие). Не хочу быть навязчивым, но сначала надо выяснить "чья" это проблема: Qt или Вындоуз, поэкспериметировав в нативном коде. Что значит "нативный"? Если в приложениях Word, Excel, etc. диалог (абсолютно тот же самый) открывается сразу и нет тормозов, то разве это проблемы системы?Цитировать это цикл обработки сообщений (блокирующий, поэтому не нагружающий систему). проблема где-то глубже. Ну нифига себе. Крутился в цикле минут 5, но так и не вышел из него. Куда глубже-то?Тут возник вопрос такой! :) есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети? Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 14:25 Тут возник вопрос такой! есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети?
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: Igors от Октябрь 06, 2009, 14:41 Что значит "нативный"? Если в приложениях Word, Excel, etc. диалог (абсолютно тот же самый) открывается сразу и нет тормозов, то разве это проблемы системы? Я бы с выводами не торопился, а толкнул бы сначала ::GetOpenFileName и посмотрел. Если задержки нет - то как минимум 1 решение есть (пусть не самое лучшее).Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 15:45 Я бы с выводами не торопился, а толкнул бы сначала ::GetOpenFileName и посмотрел. Если задержки нет - то как минимум 1 решение есть (пусть не самое лучшее). В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком?Какое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз... Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: BlackTass от Октябрь 06, 2009, 15:48 Ну нифига себе. Крутился в цикле минут 5, но так и не вышел из него. Куда глубже-то? Запустите профайлер и посмотрите в нем. Цитировать В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком? Замените вызов кутешного диалога на вызов нативного и посмотрите что будет. Если будет также тормозить, то проблема в нативном диалоге (то есть в системе), если не будет тормозить, то проблема в куте.Какое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз... Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: Igors от Октябрь 06, 2009, 16:11 В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком? Сделайте простую функцию, текст возьмите хотя бы отсюдаКакое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз... http://www.daniweb.com/code/snippet217307.html# (http://www.daniweb.com/code/snippet217307.html#) - это первое что Google нашла на "getopenfilename example". Вставьте вызов этой функции в Вашу программу и выполните ее. Это "native" код, т.е. он будет работать только для платформы Вындоуз. Но как минимум это уточнит где что искать и займет 15 минут. Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 06, 2009, 17:46 Ура! :) Стандартная функция Windows GetOpenFileName работает отлично! :)
Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить! Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: Igors от Октябрь 06, 2009, 19:29 Ура! :) Стандартная функция Windows GetOpenFileName работает отлично! :) С поспешным отчетом можно и лохануться (как я убедился на собственном опыте :)). В Qt есть 2 возможности: нативный файл диалог (о нем все время и шла речь) и собственный Qt файл диалог. Для отчета как минимум нужно проверить (и сообщить) как ведет себя не-нативный (собственный). Ну и конечно можно найти место где их нативный дает тормоза. Но это непросто и, возможно, сведется к дыре в OS. В конце концов, Вас, как пользователя Qt не должны волновать подробности, это 100% корректно. Но "для понту воровского" (нарисовать черную кошку и.т.п) - все-таки найти :)Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить! Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 07, 2009, 05:55 С поспешным отчетом можно и лохануться (как я убедился на собственном опыте :)). В Qt есть 2 возможности: нативный файл диалог (о нем все время и шла речь) и собственный Qt файл диалог. Тормозят оба. А вот Windows функция не тормозит, проверил на нескольких машинах.Для отчета как минимум нужно проверить (и сообщить) как ведет себя не-нативный (собственный). Ну и конечно можно найти место где их нативный дает тормоза. Но это непросто и, возможно, сведется к дыре в OS. В конце концов, Вас, как пользователя Qt не должны волновать подробности, это 100% корректно. Но "для понту воровского" (нарисовать черную кошку и.т.п) - все-таки найти :) ... А разве не их задача найти конкретное место ошибки? Просто.... когда находится место ошибки - то 2/3 работы выполнено, как правило (убедился на своем опыте).Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 07, 2009, 08:25 Вот реализация "оберток":
Код
Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: shadone от Октябрь 07, 2009, 12:12 ... А разве не их задача найти конкретное место ошибки? Просто.... когда находится место ошибки - то 2/3 работы выполнено, как правило (убедился на своем опыте). "они" ничем не обязаны, если конечно у вас нет лицензии на Qt. Тем более что проблему воспроизвести не так-то просто - что мне нужно сделать с сетью чтобы диалог открывался тоже медленно? Однако я бы хотел помочь, улучшить диалог открытия файла в Qt, но для этого нужна помощь в поиске ошибки. QFileDialog::getOpenFileName использует ту же самую функцию ::GetOpenFileName и тот же набор флагов - вот его исходники http://qt.gitorious.org/qt/qt/blobs/master/src/gui/dialogs/qfiledialog_win.cpp#line243 - в чем может быть разница? я правильно понимаю что initialDir - начальный каталог для открытия диалогу установлен в сетевой путь? в каком виде - в виде UNC пути (\\server\share\dir), в виде полного пути (\\\?\server\share\dir) или же подключен сетевой диск? Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети Отправлено: pastor от Октябрь 07, 2009, 12:22 Набор флагов немножко отличается:
Код
AD, поиграйся с этими флагами. Также поставь точку останова на вызове GetOpenFileName в функции qt_win_get_open_file_name и глянь где тормозит - до неё или после. В зависимости от результата точку останова перемещай (локализируй место). Название: Re: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сет Отправлено: AD от Октябрь 07, 2009, 15:20 я правильно понимаю что initialDir - начальный каталог для открытия диалогу установлен в сетевой путь? в каком виде - в виде UNC пути (\\server\share\dir), в виде полного пути (\\\?\server\share\dir) или же подключен сетевой диск? Лицензия есть. Хорошо, поищу на досуге. pastor, Спасибо!Нет, конечно. Диск совсем несетевой. Путь выглядит так, к примеру: D:\Projects\Src\TransasLogViewer\SourceData\Airplanes\min_vodi.log |