Russian Qt Forum
Май 03, 2024, 19:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Проблем с функцией QFileDialog::getOpenFileName, при нестабильной работе сети  (Прочитано 30394 раз)
AD
Гость
« Ответ #30 : Октябрь 06, 2009, 17:46 »

Ура! Улыбающийся Стандартная функция Windows GetOpenFileName работает отлично! Улыбающийся
Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Октябрь 06, 2009, 19:29 »

Ура! Улыбающийся Стандартная функция Windows GetOpenFileName работает отлично! Улыбающийся
Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить!
С поспешным отчетом можно и лохануться (как я убедился на собственном опыте  Улыбающийся). В Qt есть 2 возможности: нативный файл диалог (о нем все время и шла речь) и собственный Qt файл диалог. Для отчета как минимум нужно проверить (и сообщить) как ведет себя не-нативный (собственный). Ну и конечно можно найти место где их нативный дает тормоза. Но это непросто и, возможно, сведется к дыре в OS. В конце концов, Вас, как пользователя Qt не должны волновать подробности, это 100% корректно. Но "для понту воровского" (нарисовать  черную кошку и.т.п) - все-таки найти  Улыбающийся
Записан
AD
Гость
« Ответ #32 : Октябрь 07, 2009, 05:55 »

С поспешным отчетом можно и лохануться (как я убедился на собственном опыте  Улыбающийся). В Qt есть 2 возможности: нативный файл диалог (о нем все время и шла речь) и собственный Qt файл диалог.
Тормозят оба. А вот Windows функция не тормозит, проверил на нескольких машинах.

Для отчета как минимум нужно проверить (и сообщить) как ведет себя не-нативный (собственный). Ну и конечно можно найти место где их нативный дает тормоза. Но это непросто и, возможно, сведется к дыре в OS. В конце концов, Вас, как пользователя Qt не должны волновать подробности, это 100% корректно. Но "для понту воровского" (нарисовать  черную кошку и.т.п) - все-таки найти  Улыбающийся
... А разве не их задача найти конкретное место ошибки? Просто.... когда находится место ошибки - то 2/3 работы выполнено, как правило (убедился на своем опыте).
Записан
AD
Гость
« Ответ #33 : Октябрь 07, 2009, 08:25 »

Вот реализация "оберток":
Код
C++ (Qt)
/// Вызов окна диалога для выбора открываемого файла
QString getOpenFileName(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
const int NAME_SIZE = 550;
char fname[NAME_SIZE] = {0}; ///< буфер для имени файла
bool result = false;
 
#ifdef Q_WS_WIN
OPENFILENAME ofn; ///< структура диалога открытия файла
::ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = 88;
ofn.hwndOwner = (parent) ? parent -> winId() : 0;
ofn.lpstrFile = fname;
ofn.nMaxFile = sizeof(fname);
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = 0;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = directory;
ofn.lpstrTitle = caption;
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
if(::GetOpenFileName(&ofn) == 1) result = true;
#endif // Q_WS_WIN
 
return (result) ? QString(fname) : QString("");
}
 
/// Вызов окна диалога для выбора открываемых файлов
QStringList getOpenFileNames(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
const int NAME_SIZE = 5500;
char fname[NAME_SIZE] = {0}; ///< буфер для имени файла
QStringList list;
 
#ifdef Q_WS_WIN
OPENFILENAME ofn; ///< структура диалога открытия файла
::ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = 88;
ofn.hwndOwner = (parent) ? parent -> winId() : 0;
ofn.lpstrFile = fname;
ofn.nMaxFile = sizeof(fname);
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = 0;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = directory;
ofn.lpstrTitle = caption;
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
if(::GetOpenFileName(&ofn) == 1)
{
if(ofn.nFileExtension)
list << QString(fname);
else if(ofn.nFileOffset)
{
QString path(QString(fname) + QDir::separator()), name("");
for(int i=ofn.nFileOffset, j=ofn.nFileOffset+1; fname[i]!=0 || fname[j]!=0 || j<sizeof(fname); ++i,
++j)
{
if(fname[i] != 0)
name += QChar(fname[i]);
if(fname[j] == 0)
list << QString(path + name),
name.clear(),
++i, ++j;
if(fname[i] == 0 && fname[j] == 0)
break;
}
}
}
#endif // Q_WS_WIN
 
return list;
}
Записан
shadone
Гость
« Ответ #34 : Октябрь 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) или же подключен сетевой диск?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #35 : Октябрь 07, 2009, 12:22 »

Набор флагов немножко отличается:

Код
C++ (Qt)
   ofn->Flags = (OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_EXPLORER);
 
   if (mode == QFileDialog::ExistingFile ||
        mode == QFileDialog::ExistingFiles)
       ofn->Flags |= (OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST);
   if (mode == QFileDialog::ExistingFiles)
       ofn->Flags |= (OFN_ALLOWMULTISELECT);
   if (!(options & QFileDialog::DontConfirmOverwrite))
       ofn->Flags |= OFN_OVERWRITEPROMPT;

AD, поиграйся с этими флагами.

Также поставь точку останова на вызове GetOpenFileName в функции qt_win_get_open_file_name и глянь где тормозит - до неё или после. В зависимости от результата точку останова перемещай (локализируй место).
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
AD
Гость
« Ответ #36 : Октябрь 07, 2009, 15:20 »

я правильно понимаю что initialDir - начальный каталог для открытия диалогу установлен в сетевой путь? в каком виде - в виде UNC пути (\\server\share\dir), в виде полного пути (\\\?\server\share\dir) или же подключен сетевой диск?
Лицензия есть. Хорошо, поищу на досуге. pastor, Спасибо!

Нет, конечно. Диск совсем несетевой. Путь выглядит так, к примеру:
D:\Projects\Src\TransasLogViewer\SourceData\Airplanes\min_vodi.log
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 22.