class Foo : public QObject
{
Q_OBJECT
// lots of blah...
public Q_SLOTS:
void start();
};
int main() {
QThread* thread = new QThread;
Foo* foo = new Foo;
foo->moveToThread(thread);
thread->start();
return 0;
}
#include <QtGui>
#include <QThread>
class Foo : public QObject {
Q_OBJECT;
public Q_SLOTS:
void start() {qDebug() << "hello\n";}
};
int main(int argc, char **argv)
{
QApplication app(argc,argv);
QThread* thread = new QThread;
Foo* foo = new Foo;
// f->moveToThread(t);
// t->start();
return app.exec();
}
Выдает ошибку на «Foo* foo = new Foo;». Как я понял это связанно с неопределенными виртуальными функциями.
Какие функции я должен определить чтобы заработало?
Он запускается, причем даже с event loop'ом в новых версиях Qt, но ничего не делает. Ты наверное думаешь, что за тебя кто-то вызовет слот Foo::start, а зря, тебе нужно вызывать его самому.
Вот тебе полный пример:
#include <QtGui>
#include <QThread>
class Foo : public QObject {
Q_OBJECT;
public Q_SLOTS:
void hello() { qDebug() << "hello from" << thread(); }
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QThread* thread = new QThread;
Foo* foo = new Foo;
foo->moveToThread(thread);
thread->start();
// Исключительно в показательных целях.
// В реальном приложении нужно связать слот с каким-нибудь сигналом.
QMetaObject::invokeMethod(foo, "hello", Qt::AutoConnection);
qDebug() << "main thread" << app.thread();
return app.exec();
}
#include "moc_main.cpp"
Что-то вы тут все не то делаете. Этот код просто переносит Ваш QObject-класс в эвент луп нового потока, но ничего не запускает.
Нужно ещё как-то вызвать этот слот в Вашем классе. Вариантов несколько: раз: присоединить к этому слоту сигнал и просигналить; два: QMetaObject::invokeMethod(); три: унаследовать таки временный класс от QThread, переопределив метод run(), в котором и вызвать метод в Вашем классе.
Выдает ошибку на «Foo* foo = new Foo;». Как я понял это связанно с неопределенными виртуальными функциями. Какие функции я должен определить чтобы заработало?
Вам надо полностью описать класс Foo, я дал только заглушку