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


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> QThread
    Можно ли как узнать результат завершения потока и как его задать в самом потоке ?
      ExpandedWrap disabled
         class MyThread : public QThread
         {
         public:
             int result() const;
         protectes:
             void run();
             int m_result;
         };
         
         void MyThread::run()
         {
            // ...
            m_result = 5;
         }
         
         int MyThread::result() const
         {
            return m_result;
         }
      Сообщение отредактировано: archimed7592 -
        я думал что это уже реализовано у QThread :(

        З.Ы. Я наследуюсь от QThread как protected.
        Почему в секции signals нельзя использовать директиву using ?
          Цитата zss @
          З.Ы. Я наследуюсь от QThread как protected.
          Почему в секции signals нельзя использовать директиву using ?

          Потому что сигналы - это не такие же обычные ф-ции, как слоты. Ты не забывай, что в Qt своя metaobject система :).

          А разве есть какой-нибудь смысл наследоваться от QThread как protected? Я даже придумать не могу :).
            Цитата archimed7592 @
            А разве есть какой-нибудь смысл наследоваться от QThread как protected? Я даже придумать не могу

            чтоб закрыть все, и открыть только один метод (аля паттерн "Павлик Морозов" :))
              Ну а зачем? :)
              Используй тогда аггрегацию(has-a) вместо наследования(is-a) (аля паттерн Адаптер :lol:)...
              Сообщение отредактировано: archimed7592 -
                Цитата archimed7592 @
                Используй тогда аггрегацию(has-a) вместо наследования(is-a) (аля паттерн Адаптер )...

                а как ты себе это представляешь для QThread ?
                  Ммм... Не особо помню как устроен QThread, но, тем не менее:
                  ExpandedWrap disabled
                    class MyThread
                    {
                        QThread thread;
                    public:
                        MyThread()
                            : thread(...)
                        { }
                        int run()
                        {
                           ...
                           thread.run();
                           return ...
                        }
                    }
                    run чисто виртуальный метод - поэтому нельзя создать оюъект QThread в MyThread
                      ExpandedWrap disabled
                        class MyThread
                        {
                            class ThreadImpl : public QThread
                            {
                               void run() { ... }
                            };
                            ThreadImpl thread;
                        public:
                            MyThread()
                                : thread(...)
                            { }
                            int run()
                            {
                               ...
                               thread.run();
                               return ...
                            }
                        }
                        archimed7592, тогда от него нельзя наследоваться и верекрывать виртуальный run :)

                        мне нужно просто оставить 2 слота started & finished

                        Может не городить, а просто их вызвать ?
                        ExpandedWrap disabled
                          class MyClass : protected QThread {
                          public slots :
                              void started (void) { emit QThread::started();  }
                              void finished(void) { emit QThread::finished(); }
                          }
                          Цитата zss @
                          тогда от него нельзя наследоваться и верекрывать виртуальный run :)

                          Template Method.



                          Цитата zss @
                          Может не городить, а просто их вызвать ?

                          Так вызываются только сигналы... Слоты можно вызывать точно так же, как самые обыкновенные ф-ции.
                            Цитата archimed7592 @
                            Так вызываются только сигналы... Слоты можно вызывать точно так же, как самые обыкновенные ф-ции.

                            точно тогда так
                            ExpandedWrap disabled
                              class MyClass : protected QThread {
                              public slots :
                                  void started (void) { QThread::started();  }
                                  void finished(void) { QThread::finished(); }
                              }



                            Цитата archimed7592 @
                            Template Method.

                            что ты имеешь ввиду
                              Цитата zss @
                              что ты имеешь ввиду

                              ExpandedWrap disabled
                                class MyThread
                                {
                                    class ThreadImpl : public QThread
                                    {
                                       MyThread &parent;
                                       void run() { parent.run() }
                                    public:
                                        ThreadImpl(MyThread &parent) : QThread(...), parent(patent) { }
                                    };
                                    ThreadImpl thread;
                                public:
                                    MyThread()
                                        : thread(*this)
                                    { }
                                    int run()
                                    {
                                       return this->runImpl();
                                    }
                                private:
                                    virtual int runImpl() = 0;
                                }
                                Цитата archimed7592 @
                                MyThread()
                                : thread(*this)
                                { }

                                разве можно использовать this в конструкторе. Объект еще не создан и моя студия ругается на это...
                                  Ругается или предупреждает? :)
                                  Смотря как использовать...
                                    тут еще вопросик возник.

                                    Вот например класса
                                    ExpandedWrap disabled
                                      class MyThread : protected QThread {
                                      private :
                                          virtual void run (void)
                                          {
                                              ...
                                          }
                                       
                                      public :
                                          void connect (void)
                                          {
                                              QThread::start ();
                                          }
                                          void disconnect (void) {...}
                                      }


                                    тоесть метод connect запускает отдельный поток, а сигнал finished говорит о его завершении.
                                    Но тут понадобилось и disconnect запускать в отдельном потоке и тоже ожидать finished.

                                    Получается нужно 2 разных объекта-потока создавать ?
                                      Цитата zss @
                                      Получается нужно 2 разных объекта-потока создавать ?

                                      Вот ты и пришёл потихоньку к аггрегации :).

                                      Хотя... Система сигнал/слотов спасёт отца русской демократии ;).
                                      Сделай disconnected слотом и прицепи на него нужный сигнал.
                                        Цитата archimed7592 @
                                        Хотя... Система сигнал/слотов спасёт отца русской демократии .
                                        Сделай disconnected слотом и прицепи на него нужный сигнал

                                        не понял - а что это даст ?

                                        Есть 2 разных метода, 2 разных потока, 2 разных слота...
                                          Цитата zss @
                                          Есть 2 разных метода, 2 разных потока, 2 разных слота...

                                          Ааа, я просто неправильно тебя понял :).

                                          Цитата zss @
                                          Получается нужно 2 разных объекта-потока создавать ?

                                          Если тебе нужно 2 потока, то создавать нужно, ессно 2 объекта-потомка QThread.
                                            Цитата archimed7592 @
                                            Если тебе нужно 2 потока, то создавать нужно, ессно 2 объекта-потомка QThread.

                                            а как быть если общие жанные нужны - например состояние
                                              Цитата zss @
                                              а как быть если общие жанные нужны - например состояние

                                              Паттерн State :D.
                                              Ну а по хорошему - просто общую структурку создрать и хранить shared_ptr на неё в обоих объектах-потоках. Либо, если они оба будут неотделимым целым от третьего класса, то просто хранить указатель на "папу".
                                                Цитата archimed7592 @
                                                Паттерн State

                                                пока не дочитал до него :)


                                                Цитата archimed7592 @
                                                Ну а по хорошему - просто общую структурку создрать и хранить shared_ptr на неё в обоих объектах-потоках. Либо, если они оба будут неотделимым целым от третьего класса, то просто хранить указатель на "папу".

                                                а можно ли по-другому.

                                                Например сам класс - хранит данные и реализует методы, но не является потоковым
                                                ExpandedWrap disabled
                                                  class MyClass
                                                  private :
                                                     // data
                                                   
                                                  public :
                                                      bool connect (void) {...}
                                                      bool disconnect (void) {...}


                                                а 2 потоковых объекта реализуют вызов
                                                ExpandedWrap disabled
                                                  class ConnectThread : public QThread {
                                                  private :
                                                      MyClass& m_class;
                                                   
                                                      virtual void run (void) { m_class.connect(); }
                                                   
                                                  public :
                                                      explicit ConnectThread (MyClass& mclass) : m_class (m_class) {}
                                                   
                                                  }
                                                   
                                                  class DisconnectThread : public QThread {
                                                  private :
                                                      MyClass& m_class;
                                                   
                                                      virtual void run (void) { m_class.disconnect(); }
                                                   
                                                  public :
                                                      explicit DisconnectThread (MyClass& mclass) : m_class (m_class) {}
                                                   
                                                  }


                                                ли это не совсем правильно ?
                                                Сообщение отредактировано: zss -
                                                  Та не... Всё прально. Только нет гарантии продолжительности жизни m_class.
                                                    Цитата archimed7592 @
                                                    Та не... Всё прально. Только нет гарантии продолжительности жизни m_class.

                                                    ну тогда так

                                                    ExpandedWrap disabled
                                                      class ConnectThread : public QThread {
                                                      private :
                                                          boost::weak_ptr<MyClass> m_class;
                                                       
                                                          virtual void run (void)
                                                          {
                                                              if (m_class.expired()) return;
                                                              m_class.connect();
                                                          }
                                                       
                                                      public :
                                                          explicit ConnectThread (boost::weak_ptr<MyClass> mclass) : m_class (m_class) {}
                                                      }


                                                    Хотя объект-поток должен умереть, после того как поток отработал. Нет смысла использовать этот объект.
                                                    Проще создать новый. Поэтому и время его жизни должно быть не более чем у m_class
                                                    Сообщение отредактировано: zss -
                                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                    0 пользователей:


                                                    Рейтинг@Mail.ru
                                                    [ Script execution time: 0,0553 ]   [ 16 queries used ]   [ Generated: 3.05.24, 16:38 GMT ]