【问题标题】:Threads & Event loop in the Qt application [closed]Qt应用程序中的线程和事件循环[关闭]
【发布时间】:2016-07-12 03:17:10
【问题描述】:

谁能解释线程和事件循环的区别,以及如何在 QT 应用程序中使用它。

我可以在哪里使用移动到线程并完成线程类?

【问题讨论】:

    标签: multithreading qt event-handling thread-safety


    【解决方案1】:

    开始阅读here 了解一些基本信息,阅读here 了解完整信息。

    【讨论】:

      【解决方案2】:

      每个线程都处理自己的事件循环,您通常无需担心这一点 - 它会为您处理好,除非您有特定的理由让它独自一人。

      QThread 是 Qt 提供的一个类,用于控制线程的操作。将对象“放入”该线程的方法是使用 moveToThread() 函数。

      您不应该为了在线程中运行某些代码而继承 QThread 类(使用 moveToThread 函数),继承 QThread 类的唯一原因是如果您想更改线程控件的行为。

      以下是让对象在线程中运行的基本步骤:

      MyObj *myObj = new MyObj(0); // 0 = no parent if your object inherits QObject
      QThread* thread = new QThread;
      myObj->moveToThread(thread);
      QObject::connect(thread, SIGNAL(started()), myObj, SLOT(run()));
      thread->start();
      

      一旦您调用 start(),线程将启动并发出启动信号,您的对象将接收它并在其槽/函数 run() 中处理它。

      注意:当对象内的函数/槽 run() 结束时,您的线程不会结束(因此您不需要执行“永远”循环)。线程仅在您告诉它退出(或销毁它)时才停止,这意味着您的线程可以处于空闲状态,直到它接收到信号或事件 - 这是事件循环进入的地方 - 传入事件由事件循环内的事件循环处理QThread 类。

      注意:此代码也是一个 sn-p - 它不处理线程的关闭,您可以使用其他“模板”代码。

      编辑

      因此事件由事件队列处理(例如鼠标点击事件,所有基本类型为 QEvent) - 更多地被系统使用,其中某些事件可能会触发信号(例如 onClicked)。信号和槽是一种不同的机制,用户更多地使用它,您可以使用 connect() 函数在槽中处理它们。这是一个更好的解释,然后我可以想出: see here

      【讨论】:

      • 您能否详细解释一下 - 这是事件循环的来源 - 传入信号由 QThread 类中的事件循环处理
      • 我添加了一个链接和一个小描述
      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 2013-05-24
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多