Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.103.8] |
|
Сообщ.
#1
,
|
|
|
Можно ли как узнать результат завершения потока и как его задать в самом потоке ?
|
Сообщ.
#2
,
|
|
|
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; } |
Сообщ.
#3
,
|
|
|
я думал что это уже реализовано у QThread
З.Ы. Я наследуюсь от QThread как protected. Почему в секции signals нельзя использовать директиву using ? |
Сообщ.
#4
,
|
|
|
Цитата zss @ З.Ы. Я наследуюсь от QThread как protected. Почему в секции signals нельзя использовать директиву using ? Потому что сигналы - это не такие же обычные ф-ции, как слоты. Ты не забывай, что в Qt своя metaobject система . А разве есть какой-нибудь смысл наследоваться от QThread как protected? Я даже придумать не могу . |
Сообщ.
#5
,
|
|
|
Цитата archimed7592 @ А разве есть какой-нибудь смысл наследоваться от QThread как protected? Я даже придумать не могу чтоб закрыть все, и открыть только один метод (аля паттерн "Павлик Морозов" ) |
Сообщ.
#6
,
|
|
|
Ну а зачем?
Используй тогда аггрегацию(has-a) вместо наследования(is-a) (аля паттерн Адаптер )... |
Сообщ.
#7
,
|
|
|
Цитата archimed7592 @ Используй тогда аггрегацию(has-a) вместо наследования(is-a) (аля паттерн Адаптер )... а как ты себе это представляешь для QThread ? |
Сообщ.
#8
,
|
|
|
Ммм... Не особо помню как устроен QThread, но, тем не менее:
class MyThread { QThread thread; public: MyThread() : thread(...) { } int run() { ... thread.run(); return ... } } |
Сообщ.
#9
,
|
|
|
run чисто виртуальный метод - поэтому нельзя создать оюъект QThread в MyThread
|
Сообщ.
#10
,
|
|
|
class MyThread { class ThreadImpl : public QThread { void run() { ... } }; ThreadImpl thread; public: MyThread() : thread(...) { } int run() { ... thread.run(); return ... } } |
Сообщ.
#11
,
|
|
|
archimed7592, тогда от него нельзя наследоваться и верекрывать виртуальный run
мне нужно просто оставить 2 слота started & finished Может не городить, а просто их вызвать ? class MyClass : protected QThread { public slots : void started (void) { emit QThread::started(); } void finished(void) { emit QThread::finished(); } } |
Сообщ.
#12
,
|
|
|
Цитата zss @ тогда от него нельзя наследоваться и верекрывать виртуальный run Template Method. Цитата zss @ Может не городить, а просто их вызвать ? Так вызываются только сигналы... Слоты можно вызывать точно так же, как самые обыкновенные ф-ции. |
Сообщ.
#13
,
|
|
|
Цитата archimed7592 @ Так вызываются только сигналы... Слоты можно вызывать точно так же, как самые обыкновенные ф-ции. точно тогда так class MyClass : protected QThread { public slots : void started (void) { QThread::started(); } void finished(void) { QThread::finished(); } } Цитата archimed7592 @ Template Method. что ты имеешь ввиду |
Сообщ.
#14
,
|
|
|
Цитата zss @ что ты имеешь ввиду 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; } |
Сообщ.
#15
,
|
|
|
Цитата archimed7592 @ MyThread() : thread(*this) { } разве можно использовать this в конструкторе. Объект еще не создан и моя студия ругается на это... |
Сообщ.
#16
,
|
|
|
Ругается или предупреждает?
Смотря как использовать... |
Сообщ.
#17
,
|
|
|
тут еще вопросик возник.
Вот например класса class MyThread : protected QThread { private : virtual void run (void) { ... } public : void connect (void) { QThread::start (); } void disconnect (void) {...} } тоесть метод connect запускает отдельный поток, а сигнал finished говорит о его завершении. Но тут понадобилось и disconnect запускать в отдельном потоке и тоже ожидать finished. Получается нужно 2 разных объекта-потока создавать ? |
Сообщ.
#18
,
|
|
|
Цитата zss @ Получается нужно 2 разных объекта-потока создавать ? Вот ты и пришёл потихоньку к аггрегации . Хотя... Система сигнал/слотов спасёт отца русской демократии . Сделай disconnected слотом и прицепи на него нужный сигнал. |
Сообщ.
#19
,
|
|
|
Цитата archimed7592 @ Хотя... Система сигнал/слотов спасёт отца русской демократии . Сделай disconnected слотом и прицепи на него нужный сигнал не понял - а что это даст ? Есть 2 разных метода, 2 разных потока, 2 разных слота... |
Сообщ.
#20
,
|
|
|
Цитата zss @ Есть 2 разных метода, 2 разных потока, 2 разных слота... Ааа, я просто неправильно тебя понял . Цитата zss @ Получается нужно 2 разных объекта-потока создавать ? Если тебе нужно 2 потока, то создавать нужно, ессно 2 объекта-потомка QThread. |
Сообщ.
#21
,
|
|
|
Цитата archimed7592 @ Если тебе нужно 2 потока, то создавать нужно, ессно 2 объекта-потомка QThread. а как быть если общие жанные нужны - например состояние |
Сообщ.
#22
,
|
|
|
Цитата zss @ а как быть если общие жанные нужны - например состояние Паттерн State . Ну а по хорошему - просто общую структурку создрать и хранить shared_ptr на неё в обоих объектах-потоках. Либо, если они оба будут неотделимым целым от третьего класса, то просто хранить указатель на "папу". |
Сообщ.
#23
,
|
|
|
Цитата archimed7592 @ Паттерн State пока не дочитал до него Цитата archimed7592 @ Ну а по хорошему - просто общую структурку создрать и хранить shared_ptr на неё в обоих объектах-потоках. Либо, если они оба будут неотделимым целым от третьего класса, то просто хранить указатель на "папу". а можно ли по-другому. Например сам класс - хранит данные и реализует методы, но не является потоковым class MyClass private : // data public : bool connect (void) {...} bool disconnect (void) {...} а 2 потоковых объекта реализуют вызов 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) {} } ли это не совсем правильно ? |
Сообщ.
#24
,
|
|
|
Та не... Всё прально. Только нет гарантии продолжительности жизни m_class.
|
Сообщ.
#25
,
|
|
|
Цитата archimed7592 @ Та не... Всё прально. Только нет гарантии продолжительности жизни m_class. ну тогда так 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 |