脱文件的国家的信号,并插槽可以 direct, queuedauto.

它还指出,如果对象是拥有老虎'生命'在一个线程的不同对象,拥有信号,发出这种信号将发布消息-信号发会返回,立即和老虎的方法将被称为目标的线的事件循环。

不幸的是,文件没有指定,'生命'的代表和没有实例。我已经尝试了下列代码:

main.h:

class CThread1 : public QThread
{
Q_OBJECT
public:
    void run( void )
    {
        msleep( 200 );
        std::cout << "thread 1 started" << std::endl;
        MySignal();
        exec();
    }
signals:
    void MySignal( void );
};

class CThread2 : public QThread
{
Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
public slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    }
};

main.cpp:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CThread1 oThread1;
    CThread2 oThread2;
    QObject::connect( & oThread1, SIGNAL( MySignal() ),
        & oThread2, SLOT( MySlot() ) );
    oThread1.start();
    oThread2.start();
    oThread1.wait();
    oThread2.wait();
    return a.exec();
}

输出为:

thread 2 started
thread 1 started

MySlot() 是从来没有称为:(.我做错了什么?

有帮助吗?

解决方案

有相当多的问题与你的代码:

  • 像所说的埃文的这些关键词是失踪
  • 你所有的对象生活在主要线,只码在运行方法生活在其他线,这意味着MySlot隙就会被称为主线和我不确定这是你想要什么
  • 你将永远不会被称为因为主要事件循环将永远不会被推出:你的两个电话要等()将仅超时后很长的时间(你可能会杀了你的申请之前发生的),并且我不认为那是你想要什么,反正他们真的没有使用你的代码。

这个代码很可能工作(虽然我没有测试过的话)而且我认为它做什么,你想要它做的事:

class MyObject : public QObject
{
    Q_OBJECT
public slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    }
};

class CThread1 : public QThread
{
    Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 1 started" << std::endl;
        int i = 0;
        while(1)
        {
           msleep( 200 );
           i++;
           if(i==1000)
              emit MySignal();
        }
    }
signals:
    void MySignal( void );
};

class CThread2 : public QThread
{
    Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CThread1 oThread1;
    CThread2 oThread2;
    MyObject myObject;
    QObject::connect( & oThread1, SIGNAL( MySignal() ),
        & myObject, SLOT( MySlot() ) );
    oThread2.start();
    myObject.moveToThread(&oThread2)
    oThread1.start();
    return a.exec();
}

现在MyObject将生活在thread2(由于moveToThread).

MySignal应送从thread1(以为我不知道在那之一,它可能会被发送自主线,它并不真正的问题).

没有的事件循环是必要的,thread1由于发光信号并不需要一个活动循环。一个事件循环是必要的,thread2(lanched通过exec()),以接收信号。

MySlot将在thread2.

其他提示

不要子类的QThread Qt的4.4 +

虽然Aiua的回答是不错的,我想指出用的QThread和Qt 4.6或4.7的一些问题。

此文章概括起来: HTTP:/ /blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

缺乏文件上Qt的部分

不幸的是,从问题缺乏更新的文档的茎。 QT间期之前4.4的QThread没有默认的run()执行,这意味着,你必须继承的QThread才能使用它。

如果您正在使用Qt 4.6或者4.7,那么你几乎可以肯定是应该的的子类的QThread。

使用moveToThread

要获得时隙在工作线程执行的关键是使用moveToThread方法Aiua指出。

您应该发出信号,开始喜欢你的线程函数

emit operateCut(examId,examName_examTemplate[examName].studentIdRec,examName_examTemplate[examName].choiceRecA,examName_examTemplate[examName].choiceRecB,examName_examTemplate[examName].objectRecA,examName_examTemplate[examName].objectRecB);

则可以在该信号加到多个参数

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top