Код: Выделить всё
MyWorker *worker = new MyWorker();
QThread *thread = new QThread();
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
connect(worker, SIGNAL(done()), thread, SLOT(quit()));
connect(worker, SIGNAL(done()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
Код: Выделить всё
Qt::AutoConnection[*]
Код: Выделить всё
Qt::AutoConnection[*]
Код: Выделить всё
Qt::DirectConnection[*]
Код: Выделить всё
Qt::QueuedConnection[*]
Код: Выделить всё
moveToThread()[*]A QThread will remain active (regardless of the objects within) until QThread::quit() is called (which is why the connect to SLOT(quit()) in the above code example is so important
So Это приводит меня к двум вопросам для возможного варианта использования, который, по -видимому, немного поступает против формулы назначения QThread , и которую я действительно не смог найти обсуждаемой. PrettyPrint-Override ">
Код: Выделить всё
MyWorker *worker = new MyWorker();
QThread *workerThread = new QThread();
worker->moveToThread(workerThread);
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(workerThread, SIGNAL(finished(), thread, SLOT(deleteLater()));
workerThread->start();
Код: Выделить всё
MyTrigger trigger;
connect(&trigger, SIGNAL(triggered()), worker, SLOT(doSomething()));
Вопрос 2 - В каком потоке создан объект? Продолжая из приведенного выше примера, допустим, что я хочу заменить MyWorker на какие -то более широкие возможности, где я хочу, чтобы вся возможность работать в этом отдельном потоке. Я думаю о том, чтобы по существу расширить приведенную выше идею, но вместо того, чтобы использовать один класс, используя серию классов, которые создаются из центрального класса. Я думаю, это что-то вроде < /p>
Код: Выделить всё
class MyCapability: public QObject {
Q_OBJECT
public:
MyOtherWorker* getOtherWorker() {
return worker2;
}
public slots:
void setup() {
worker1 = new MyWorker();
worker2 = new MyOtherWorker();
connect(worker1, SIGNAL(something()), worker2, SLOT(other()));
}
void doSomething() {
worker1->doSomething();
}
private:
MyWorker *worker1;
MyOtherWorker *worker2;
};
MyCapability *capability = new MyCapability();
QThread *capabilityThread = new QThread();
capability->moveToThread(capabilityThread);
connect(capabilityThread, SIGNAL(started()), capability, SLOT(setup()));
connect(capabilityThread, SIGNAL(finished()), capability, SLOT(deleteLater()));
connect(capabilityThread, SIGNAL(finished(), thread, SLOT(deleteLater()));
capabilityThread->start();
< /code>
Так: < /p>
[list]
[*]capability[*] Поскольку MyCapability :: setup () называется внутри capabilityThread Все, что будет принадлежать, будет принадлежать CapabilityThread , а также
[*]
Код: Выделить всё
worker1::something()[/list]
Когда это используется от внешнего
Код: Выделить всё
MyTrigger trigger;
connect(&trigger, SIGNAL(doSomethingTrigger()), capability, SLOT(doSomething()));
connect(&trigger, SIGNAL(doOtherTrigger()), capability->getOtherWorker(), SLOT(other()));
< /code>
triggerЯвляется ли мое понимание на этих двух фронтах правильно? Из каких ошибочных предположений я работаю?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/795 ... -lifecycle
Мобильная версия