qt如何将我的函数放入线程中

Eag*_*ing 7 qt multithreading

我是QT的新手.我有一个类从小部件扩展,如:

class myclass: public Qwidget
{
Q_OBJECT
public:
  void myfunction(int);
slots:
  void myslot(int)
  {
    //Here I want to put myfunction into a thread
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

我不知道怎么做.请帮我.

Red*_*edX 15

添加一个QThread成员然后myslot将对象移动到该线程并运行该函数.

class myclass: public Qwidget
{
   QThread thread;
public:
slots:
  void myfunction(int); //changed to slot
  void myslot(int)
  {
    //Here I want to put myfunction into a thread
    moveToThread(&thread);
    connect(&thread, SIGNAL(started()), this, SLOT(myfunction())); //cant have parameter sorry, when using connect
    thread.start();
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

我的答案基本上与本文相同:是否可以在不对其进行子类化的情况下使用QThread实现轮询?

  • Qt doc说:moveToThread会更改此对象及其子对象的线程关联.如果对象具有父对象,则无法移动该对象.他有一个小部件,它可能有一个父母.你必须要小心这个小部件的父级.你可能根本不会移动它!你怎么看 ? (3认同)
  • 由于这是qt +线程的流行结果,因此应将其扔进碗中:http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ (2认同)

O.C*_*.C. 5

你的问题很广泛。请找到一些可能对您有益的替代方案:

  • 如果您想使用信号/插槽机制并在线程上下文中执行您的插槽,您可以使用moveToThread方法将您的对象移动到一个线程中(或直接在 QThread 的 run 方法中创建它)并在该线程的上下文中执行您的插槽。但是 Qt Docs 说

如果对象有父对象,则无法移动对象。

由于您的对象是一个小部件,我假设它会有一个父对象。

因此,这种方法不太可能对您有用。

  • 另一种选择是使用QtConcurrent::run()这允许一个方法由另一个线程执行。但是这样你就不能使用信号/插槽机制。由于您将方法声明为插槽。我假设您想使用这种机制。如果你不在乎,那么这个方法对你很有用。

  • 最后,您可以在您的插槽中创建一个QThread子类并在那里执行您喜欢的任何操作。

这就是我能想到的。

我希望这有帮助。