На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (6) [1] 2 3 ...  5 6 все  ( Перейти к последнему сообщению )  
> QDialog
    попытался создать диалог, который при создании создает таймер и обновляет иконку.
    Тоесть я хочу его запускать при длительных операциях для отображения окна действия пользователя.

    ExpandedWrap disabled
      QDialog dialog;
      dialog.show();
      ...
      // долгие расчеты, возможно в разных потоках и с синхронизацией
      Sleep (10000); // эмуляция
      ...
       
      dialog.hide();


    Но таймер не срабатывает. Было предположение, что таймер работает в контексте GUI-потока.
    Попытался вместо таймера использовать поток. Кричит, что нельзя изменять компанент созданный в GUI-потоке из другого потока.

    Создал этот диалог вообще в отдельном потоке - таже фигня.

    Как создать такой диалог ?

    Добавлено
    P.S. Вся проблемма в том, что нужен именно диалог в отдельном поке, а не обработка данных. Т.к. при обработке данных обновляются
    компаненты, созданные в GUI-потоке.
      Цитата zss @
      Создал этот диалог вообще в отдельном потоке - таже фигня.

      Ты в отдельном потоке метод exec, который проталкивает очередь сообщений, вызываешь?
        Цитата Flex Ferrum @
        Ты в отдельном потоке метод exec, который проталкивает очередь сообщений, вызываешь?

        так exec для диалога это синхронный вызов окна (на сколько я понял)
          Цитата zss @
          так exec для диалога это синхронный вызов окна (на сколько я понял)

          Да нет. У самого потока есть метод exec.
            Цитата Flex Ferrum @
            Да нет. У самого потока есть метод exec.

            я не использую Qt-потоки :) я использую boost...
              Цитата zss @
              я не использую Qt-потоки :) я использую boost...

              Хех. Ну тогда ищи класс QEventLoop, и дергай у его экземпляра, созданного в потоке, метод processEvents.
                Цитата Flex Ferrum @
                Хех. Ну тогда ищи класс QEventLoop, и дергай у его экземпляра, созданного в потоке, метод processEvents.

                а можно ли все-таки создать поток в самом диалоге, чтою не плодить потоки из первичного потока ?
                  Цитата zss @
                  а можно ли все-таки создать поток в самом диалоге, чтою не плодить потоки из первичного потока ?

                  Если только ты во время твоих длительных вычислений будешь руками толкать сообщения.
                    Цитата Flex Ferrum @
                    Если только ты во время твоих длительных вычислений будешь руками толкать сообщения.

                    не получится - дергаеются методы библиотек, которые не возвращают управления до завершения :(
                      Цитата zss @
                      не получится - дергаеются методы библиотек, которые не возвращают управления до завершения

                      Тогда, если эти библиотеки не просят callback'и, только в отдельном потоке. И, кстати, элементы основного потока у тебя (при таком раскладе) врядли будут перерисовываться.
                        Цитата Flex Ferrum @
                        И, кстати, элементы основного потока у тебя (при таком раскладе) врядли будут перерисовываться.

                        при каком ? Если создаю в отдельном потоке ?

                        З.Ы. Ну принципе элементы основного потока и не так выжны...
                          Цитата zss @
                          при каком ? Если создаю в отдельном потоке ?

                          При любом.
                            Цитата Flex Ferrum @
                            При любом.

                            ну так и при показе обычного диалога этого не происходит. Это же никому не мешает
                              zss
                              я так понял, что хочешь создать диалог в не gui-потоке?

                              или диалог создается в gui-потоке и отображается во время длительных операций в другом, не gui-потоке?
                              Т.е. пользователь может сделать что-то с программой, пока в параллельном потоке что-то выполняется?
                              для чего таймер?
                                Цитата gryz @
                                для чего таймер?

                                таймер у меня в диалоге для смены картинки. Но ни разу не срабатывает. Кроме того сам диалог не перетаскивается. Он не реагирует на действия пользователя вообще.

                                Цитата gryz @
                                я так понял, что хочешь создать диалог в не gui-потоке?

                                да нет. хочу как раз в GUI-потоке. но после того как
                                ExpandedWrap disabled
                                  dialog.show();
                                  Sleep (10000);


                                на Sleep замирает весь GUI и диалог не отрисовывается.

                                Flex Ferrum, я попробовал создать QThread и вызывать exec. Не дает он создавать Widget в не GUI-потоке.
                                Или я чего-то не понял ?
                                ExpandedWrap disabled
                                  void fmMain::start (void)
                                  {
                                      m_stopped = false;
                                      QThread::start ();
                                  }
                                  void fmMain::stop (void)
                                  {
                                      m_stopped = true;
                                      QThread::wait ();
                                  }
                                  void Console::run (void)
                                  {
                                      QWaitDialog dialog ("Running...");
                                      while (!m_stopped)
                                      {
                                          QThread::exec();
                                          QThread::msleep (100);
                                      }
                                  }
                                  void fmMain::func ()
                                  {
                                      start   ();
                                      Sleep   (5000);
                                      stop    ();
                                  }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (6) [1] 2 3 ...  5 6 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0442 ]   [ 15 queries used ]   [ Generated: 17.05.24, 11:23 GMT ]