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

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

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

Можешь отдебажить ход создания Qt-шного диалога и глянуть где проблема (метод, функция, этц). Код-то открыт
Попробую. Правда, разобраться будет не очень легко. Куча кода с макросами... Но .... попробую....
Записан
Danila_Bagrofff
Гость
« Ответ #16 : Октябрь 05, 2009, 07:07 »

А если вывести это в отдельный  поток?... А поток можно оборвать по таймауту, если долго не открывается. Это хотя бы уберет зависание. Но с открытием, конечно, не поможет...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #17 : Октябрь 05, 2009, 13:10 »

А если вывести это в отдельный  поток?

С GUI нельзя работать в других потоках
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Октябрь 05, 2009, 13:35 »

Еще один тест/зацепка: создать его в нативном коде и посмотреть/поэкспериментировать. В Вындоуз ::GetOpenFileName не так уж сложно
Записан
AD
Гость
« Ответ #19 : Октябрь 06, 2009, 10:30 »

Полез в исходники QFileDialog
Некоторое, непродолжительное время (от 3 до 5 секунд (несмертельно, эти задержки незаметны в релизном режиме)) зависает при создании диалогового окна на функции init, а в ней на функции - restoreState
Код
C++ (Qt)
QFileDialog::QFileDialog(QWidget *parent,
                    const QString &caption,
                    const QString &directory,
                    const QString &filter)
   : QDialog(*new QFileDialogPrivate, parent, 0)
{
   Q_D(QFileDialog);
   d->init(directory, filter, caption);
}
 
Ну а далее основательно зависает на функции exec(), а в ней на строчках:
Код
C++ (Qt)
int QDialog::exec()
{
// ...
 
(void) eventLoop.exec();
 
/// ............
}
 

Как поправить данную проблему?
Записан
shadone
Гость
« Ответ #20 : Октябрь 06, 2009, 11:24 »


Ну а далее основательно зависает на функции exec(), а в ней на строчках:
Код
C++ (Qt)
int QDialog::exec()
{
// ...
 
(void) eventLoop.exec();
 
/// ............
}
 

Как поправить данную проблему?
это не проблема. QEventLoop::exec() запускает цикл обработки сообщений. Копай глубже в чем конкретно проблема.
Записан
AD
Гость
« Ответ #21 : Октябрь 06, 2009, 11:57 »

Ну он крутится внутри цикла
Код
C++ (Qt)
while (!d->exit)
           processEvents(flags | WaitForMoreEvents | ProcessEventsFlag(QEventLoop::DeferredDeletion));
 
функции
Код
C++ (Qt)
int QEventLoop::exec(ProcessEventsFlags flags)
{
Q_D(QEventLoop);
   if (d->threadData->quitNow)
       return -1;
 
   if (d->inExec) {
       qWarning("QEventLoop::exec: instance %p has already called exec()", this);
       return -1;
   }
   d->inExec = true;
   d->exit = false;
   d->threadData->eventLoops.push(this);
 
#if defined(QT_NO_EXCEPTIONS)
   while (!d->exit)
       processEvents(flags | WaitForMoreEvents | ProcessEventsFlag(QEventLoop::DeferredDeletion));
#else
   try {
       while (!d->exit)
           processEvents(flags | WaitForMoreEvents | ProcessEventsFlag(QEventLoop::DeferredDeletion));
   } catch (...) {
       qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
                "exceptions from an event handler is not supported in Qt. You must\n"
                "reimplement QApplication::notify() and catch all exceptions there.\n");
       throw;
   }
#endif
 
   QEventLoop *eventLoop = d->threadData->eventLoops.pop();
   Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
   Q_UNUSED(eventLoop); // --release warning
 
   d->inExec = false;
 
   return d->returnCode;
}
 
Записан
shadone
Гость
« Ответ #22 : Октябрь 06, 2009, 12:59 »

это цикл обработки сообщений (блокирующий, поэтому не нагружающий систему). проблема где-то глубже.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Шагать отладчиком в цикле событий очень тяжело и результат не гарантирует  (времена/таймауты при отладке совсем другие). Не хочу быть навязчивым, но сначала надо выяснить "чья" это проблема: Qt или Вындоуз, поэкспериметировав в нативном коде.
Записан
AD
Гость
« Ответ #24 : Октябрь 06, 2009, 13:18 »

Цитировать
Шагать отладчиком в цикле событий очень тяжело и результат не гарантирует  (времена/таймауты при отладке совсем другие). Не хочу быть навязчивым, но сначала надо выяснить "чья" это проблема: Qt или Вындоуз, поэкспериметировав в нативном коде.
Что значит "нативный"? Если в приложениях Word, Excel, etc. диалог (абсолютно тот же самый) открывается сразу и нет тормозов, то разве это проблемы системы?


Цитировать
это цикл обработки сообщений (блокирующий, поэтому не нагружающий систему). проблема где-то глубже.
Ну нифига себе. Крутился в цикле минут 5, но так и не вышел из него. Куда глубже-то?




Тут возник вопрос такой! Улыбающийся есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети?
« Последнее редактирование: Октябрь 06, 2009, 13:52 от AD » Записан
AD
Гость
« Ответ #25 : Октябрь 06, 2009, 14:25 »

Тут возник вопрос такой!  есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Что значит "нативный"? Если в приложениях Word, Excel, etc. диалог (абсолютно тот же самый) открывается сразу и нет тормозов, то разве это проблемы системы?
Я бы с выводами не торопился, а толкнул бы сначала ::GetOpenFileName и посмотрел. Если задержки нет - то как минимум 1 решение есть (пусть не самое лучшее).
Записан
AD
Гость
« Ответ #27 : Октябрь 06, 2009, 15:45 »

Я бы с выводами не торопился, а толкнул бы сначала ::GetOpenFileName и посмотрел. Если задержки нет - то как минимум 1 решение есть (пусть не самое лучшее).
В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком?
Какое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз...
Записан
BlackTass
Гость
« Ответ #28 : Октябрь 06, 2009, 15:48 »

Ну нифига себе. Крутился в цикле минут 5, но так и не вышел из него. Куда глубже-то?
Запустите профайлер и посмотрите в нем.

Цитировать
В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком?
Какое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз...
Замените вызов кутешного диалога на вызов нативного и посмотрите что будет. Если будет также тормозить, то проблема в нативном диалоге (то есть в системе), если не будет тормозить, то проблема в куте.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

В смысле толкнул? Простите, но я не понимаю таких терминов. Запустил под отладкой, нативный - "родной"? Почему нельзя сказать понятным языком?
Какое решение? Можно поподробнее, пожалуйста! Я ничего не понял из Ваших фраз...
Сделайте простую функцию, текст возьмите хотя бы отсюда
http://www.daniweb.com/code/snippet217307.html# - это первое что Google нашла на "getopenfilename example". Вставьте вызов этой функции в Вашу программу и выполните ее. Это "native" код, т.е. он будет работать только для платформы Вындоуз. Но как минимум это уточнит где что искать и займет 15 минут.


Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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