나를 위해 일하고있다. 어쩌면 당신의 구현을 아래에있는 것과 비교해 볼 수 있습니다.
my_class.h
class MyClass : public QObject {
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0);
signals:
void mySignalToMainThread();
public slots:
void someCallback();
void doThisOnMainThread();
};
MyClass::MyClass(QObject *parent) :
QObject(parent) {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
OtherClass::getInstance().setCallback(this);
connect(this, SIGNAL(mySignalToMainThread()), SLOT(doThisOnMainThread()));
}
void MyClass::someCallback() {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
emit mySignalToMainThread();
}
void MyClass::doThisOnMainThread() {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
}
other_class.h my_class.cpp : 나는 누락 된 사항에 추측, 가깝게 내가 할 수와 같은 규칙을 따르도록 시도
class OtherClass : public QObject {
Q_OBJECT
public:
static OtherClass& getInstance();
void setCallback(MyClass *cb);
public slots:
void doCallback();
private:
explicit OtherClass(QObject *parent = 0);
MyClass *cb_;
};
012 3,516,
other_class.cpp
OtherClass::OtherClass(QObject *parent) : QObject(parent) {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
}
OtherClass& OtherClass::getInstance() {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
static OtherClass singleton;
return singleton;
}
void OtherClass::doCallback() {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
cb_->someCallback();
}
void OtherClass::setCallback(MyClass *cb) {
std::cout << Q_FUNC_INFO << QThread::currentThreadId() << std::endl;
cb_ = cb;
}
주.CPP
int main (int argc, char **argv) {
QApplication app(argc, argv);
MyClass c;
QThread other;
OtherClass::getInstance().moveToThread(&other);
other.connect(&other, SIGNAL(started()),
&OtherClass::getInstance(), SLOT(doCallback()));
other.start();
QMainWindow w;
w.show();
return app.exec();
}
샘플 출력 :
__thiscall MyClass::MyClass(class QObject *)00001108
class OtherClass &__cdecl OtherClass::getInstance(void)00001108
__thiscall OtherClass::OtherClass(class QObject *)00001108
void __thiscall OtherClass::setCallback(class MyClass *)00001108
class OtherClass &__cdecl OtherClass::getInstance(void)00001108
class OtherClass &__cdecl OtherClass::getInstance(void)00001108
void __thiscall OtherClass::doCallback(void)000015AC
void __thiscall MyClass::someCallback(void)000015AC
void __thiscall MyClass::doThisOnMainThread(void)00001108
귀하의 예를 몇 가지 중요한 정보를 벗어났습니다 : MyClass의 인스턴스는 어떤 스레드에 속해 있습니까? 슬롯을 활성화하는 데는 두 가지 가능성이 있습니다. 슬롯은 수신 객체가 속한 스레드에서 활성화되거나 (기본 동작) 신호가 방출 된 스레드에서 활성화됩니다 (Qt :: Directconnection). 그래서 MyClass의 인스턴스가 메인 쓰레드에 속하면 "그냥 작동"해야합니다. 주 스레드에 속하지 않으면이 스레드를 주 스레드로 이동할 수 있습니다. – rohanpm