【问题标题】:qt How to put my function into a threadqt 如何将我的函数放入线程中
【发布时间】:2011-06-17 07:58:47
【问题描述】:

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

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

我不知道该怎么做。请帮帮我。

【问题讨论】:

    标签: multithreading qt


    【解决方案1】:

    添加一个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();
      }
      ...
    }
    

    我的回答和这篇文章基本一致:Is it possible to implement polling with QThread without subclassing it?

    【讨论】:

    • Qt 文档说:moveToThread 改变了这个对象及其子对象的线程亲和性。如果对象有父对象,则不能移动它。他有一个小部件,它可能有一个父级。你必须小心这个小部件的父级。你可能根本不动它!你怎么看?
    • 感谢您的帮助。它对我帮助很大:D
    • @orcunc:我需要改变它的孩子来解决一个新线程中的问题而不影响主进程。之后,它将值返回给主线程。这就是我的想法。你有什么想法来解决这个问题吗?请告诉我。
    • 如果我需要在不阻塞 UI 的情况下运行较长的任务,然后将结果返回到 UI,我会使用 QFutureWatcher。阅读doc.qt.nokia.com/latest/qfuturewatcher.html。检查示例。它真的很容易使用。不要惹父母和其他任何事情!在此处查看另一个示例codejourneys.blogspot.com/2008/06/… 这就是我要做的。使用 QtConcurrent 包!
    • 由于这是qt+threading的流行结果,所以应该把它扔进碗里:labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong
    【解决方案2】:

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

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

    如果对象有 父母。

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

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

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

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

    这就是我能想到的。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多