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


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

      Вот например класса
      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,0330 ]   [ 16 queries used ]   [ Generated: 3.05.24, 19:44 GMT ]