QThread moveToThread. Синхронизация в QThread

Я хочу написать некоторый класс, который должен работать в собственном потоке.
Я прочитал эту статью: http://wiki.qt.io/Threads_Events_QObjects, Он рекомендует перемещать объект, который должен работать в собственном потоке, например:

TestClass tst;
QThread *thread = new QThread();
tst.moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), &tst, SLOT(start()));

И в slot TestClass ставлю все процедуры инициализации.
1. Могу ли я переместить ToTread в конструктор TestClass? Подобно:

TestClass::TestClass() {
QThread *thread = new QThread();
this->moveToThread(thread);
thread->start();
QObject::connect(thread, SIGNAL(started()), this, SLOT(start()));
}

После этого все объекты этого класса будут работать в собственных потоках.

  1. В TestClass У меня есть личное struct которые могут быть изменены в обоих потоках.
    Должен ли я использовать mutex для этого или используйте сигнал / слоты:

    void TestClass::changeStruct(int newValue) {
    // invoked in main thread
    
    emit this->changeValue(newValue);
    
    }
    
    // slot
    void TestClass::changeStructSlot(int newValue) {
    // this slot will be invoked in the second thread
    this._struct.val = newValue;
    }
    

0

Решение

  1. Я бы не стал этого делать, по крайней мере, с точки зрения дизайна. На вершине чего TestClass предполагается, что вы пытаетесь добавить внутреннее управление потоками. Также TestClass Деструктор будет немного сложным из-за управления потоками.

  2. каждый TestClass объект имеет свой struct, Если вызов из основного потока является единственным способом изменить val тогда ничего не надо делать. Если val может быть изменен из более чем 1 потока, включая его собственный, затем использовать QMutex,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]