Qt:在两个子线程之间使用信号和插槽

时间:2013-08-05 10:59:43

标签: c++ multithreading qt

我是Qt和C ++的新手,我正在尝试制作一个运行两个子线程的程序,即threadA和threadB。这两个线程都是在main.cpp中创建的,如下所示:

ThreadA threadA;
threadA.start();
ThreadB threadB;
threadB.start();

然后两个线程独立运行。 我需要让threadA能够在threadB中调用一个方法,将数据作为参数传递给进程。我尝试使用信号和插槽,将其添加到我的main.cpp:

QThread::connect(&threadA, SIGNAL(mySignal(uint)),
    &threadB, SLOT(mySlot(uint)));

其中threadA :: mySignal(uint)用于:

//a.h
signals:
  void mySignal(unsigned int blah);
//a.cpp
  emit mySignal(42);

而threadB :: mySlot(uint)在b:

//b.h
public slots:
    void mySlot(unsigned int fluff);
//b.cpp
void threadB::mySlot(unsigned int fluff)
{ doStuff(fluff); ... }

程序编译并运行成功,但我在调试日志中收到来自QObject的消息:

QObject::connect: No such slot QThread::mySlot(uint) in ../Project/main.cpp:42

意味着编译器正在查找QThread而不是myBlot的threadB。 谁能告诉我这里哪里出错了?任何帮助都会得到很好的理解,如果有必要,我可以提供更多细节。

2 个答案:

答案 0 :(得分:1)

首先是你提到的错误

  

程序编译并运行成功,但我收到了一条消息   调试日志中的QObject:

     

QObject :: connect:没有这样的插槽QThread :: mySlot(uint)in   ../项目/ main.cpp中:42

您正在使用mySlot并已定义MySlot,请参阅您的代码

你写过

  

QThread :: connect(& threadA,SIGNAL(mySignal(uint)),       & threadB,SLOT( mySlot (uint)));

并定义了

// b.h

public slots:
    void MySlot(unsigned int fluff);

答案 1 :(得分:0)

您可能遗漏了Q_OBJECT中的threadb.h宏(可能还有threada.h)。

class ThreadB : public QObject 
{
   Q_OBJECT 
...

来自文档: All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.

我还假设您已经包含QThread子类。您应该知道QThread用于管理线程,而不是处理数据。你应该改为QObject的子类。 Read this了解更多相关信息。