如果我不使用deletelater删除qthread会发生什么?

艾哈迈德(Ahmet Gokhan)Poyraz

我正在尝试将Qthread与对象配合使用。为此,编写以下代码:

QThread *thread1 = new QThread();
serialclass *obje = new serialclass();
void MainWindow::on_pushButton_baglan_clicked()
{
  obje->moveToThread(thread1);
  connect(thread1,SIGNAL(started()),obje,SLOT(baglan()), Qt::UniqueConnection);
  connect(obje,SIGNAL(finished()),thread1,SLOT(quit())); //end of the baglan function finished() signal is emitted.
  thread1->start();
}

我的代码有效。但是我使用了quit(),而不是deletelater()。该按钮可以被按下很多次。第一个问题是,此方法正确吗?我的第二个问题是,如果我长时间按下按钮会发生什么情况。有很多线吗?每次创建一个线程吗?

库巴并没有忘记莫妮卡

这可以。您应该了解自己的工作及其原因:代码及其目的应该来自​​您以及您的理解。

当您多次按下按钮时,该应用程序可能处于以下两种状态之一:

  1. 线程已经完成:obje->thread() == nullptr并且您正在重新启动线程-它将正常工作。

  2. 该线程仍在运行:obje->thread() == thread1两者moveToThreadthread1->start()没有执行任何操作。

las,停止线程没有意义。它具有一个事件循环,该循环直到新事件到达之前才被阻止,这好像没有空闲状态QThread正在耗尽任何CPU一样。启动线程很昂贵:它会创建一个新的本机线程。完成的线程不复存在:是的,您仍然有一个QThread,但这就像拥有一个关闭文件的句柄一样。QThread毕竟是线程句柄。

您应该按值而不是按指针保留成员-这样可以避免通过点对额外间接的愚蠢过早的悲观化。您可以提前设置所有连接。您不需要on_pushButton_baglan_clicked()插槽:您可以将按钮直接与SerialClass实例连接。您还应该使用QThread可安全销毁-derived类。

您的代码如下所示。编译器将为您生成一个适当的资源分配析构函数。这是编译器的工作,它永远不会让您失败—而人类开发人员很容易失败。因此,您应该充分利用RAII的优势,因为它将RAIA手动操作转移到了可以完美完成并且几乎没有效果的机器上:)

// MyWindow.h
#include <QMainWindow>
#include <QThread>
#include "SerialClass.h"
#include "ui_MyWindow.h"

class MyWindow : public QMainWindow {
  Q_OBJECT
  class SafeThread : public QThread {
    using QThread::run; // final
  public:
    ~SafeThread() { quit(); wait(); }
  } m_serialThread;
  SerialClass m_serial;
  Ui::MyWindow ui;
public:
  MyWindow(QWidget * parent = nullptr);
};

// MyWindow.cpp
#include "MyWindow.h"

MyWindow::MyWindow(QWidget * parent) :
  QMainWindow{this}
{
  ui.setupUi(this);
  connect(ui.pushButton_baglan, &QPushButton::clicked,
          &m_serial, &SerialClass::baglan);
  m_serial.moveToThread(&m_serialThread);
  m_serialThread.start();
}

如果您不希望所有实现细节都包含在MyWindow的标头中,则应使用PIMPL

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果我不使用CSharpCodeProvider指定CompilerVersion,会发生什么,为什么大多数示例都指定它?

来自分类Dev

如果我不使用CSharpCodeProvider指定CompilerVersion,会发生什么,为什么大多数示例都指定它?

来自分类Dev

如果我为当前不使用的字符串位置分配一个值,会发生什么情况?

来自分类Dev

如果我使用非最终的ConcurrentHashMap会发生什么

来自分类Dev

Heroku:如果全部使用我的Redis连接会发生什么?

来自分类Dev

如果我安装 Wayland 会发生什么?

来自分类Dev

如果我从 grub 中删除“quiet”但不删除“splash”,会发生什么变化?

来自分类Dev

如果我合并删除了我新功能的代码的提交,会发生什么情况?

来自分类Dev

如果我的 Google 帐户被删除/停用,我的服务帐户会发生什么

来自分类Dev

如果链接到目标文件但不使用任何代码,会发生什么?

来自分类Dev

如果不使用Http响应并且未关闭连接会发生什么?

来自分类Dev

css 和 scss - 如果不使用 scss 手动更新 css 会发生什么

来自分类Dev

如果我在已删除的实体上调用EF Reload,会发生什么情况?

来自分类Dev

如果我在分支中存储更改然后删除该分支会发生什么

来自分类Dev

如果我在C#应用程序中删除App.config会发生什么?

来自分类Dev

如果我在git中删除父分支,子分支会发生什么

来自分类Dev

如果我从/ etc / hosts删除此行会发生什么

来自分类Dev

如果我在C#应用程序中删除App.config会发生什么?

来自分类Dev

如果我删除sources.list.d中的.list文件,会发生什么?

来自分类Dev

如果我删除Rabbitmq的“.erlang.cookie”文件会发生什么?

来自分类Dev

Ubuntu 18.04 - 如果我删除 /var/log/syslog 会发生什么?

来自分类Dev

如果我删除了 C++ 程序正在向其写入数据的文件,会发生什么?

来自分类Dev

为什么UNPKG是免费使用的,如果我使用过度,会发生什么?

来自分类Dev

#import是什么意思?如果我们使用#include会发生什么?

来自分类Dev

如果不删除EventListener(JavaScript),会发生什么?

来自分类Dev

如果不删除 docker 中的网络会发生什么?

来自分类Dev

如果我通过传递blob使用resultet.getString()会发生什么?

来自分类Dev

如果我在Node.js服务器中使用socket.setKeepAlive会发生什么

来自分类Dev

如果我在ReactJS或React Native的类的构造函数中使用setState()函数,将会发生什么?

Related 相关文章

  1. 1

    如果我不使用CSharpCodeProvider指定CompilerVersion,会发生什么,为什么大多数示例都指定它?

  2. 2

    如果我不使用CSharpCodeProvider指定CompilerVersion,会发生什么,为什么大多数示例都指定它?

  3. 3

    如果我为当前不使用的字符串位置分配一个值,会发生什么情况?

  4. 4

    如果我使用非最终的ConcurrentHashMap会发生什么

  5. 5

    Heroku:如果全部使用我的Redis连接会发生什么?

  6. 6

    如果我安装 Wayland 会发生什么?

  7. 7

    如果我从 grub 中删除“quiet”但不删除“splash”,会发生什么变化?

  8. 8

    如果我合并删除了我新功能的代码的提交,会发生什么情况?

  9. 9

    如果我的 Google 帐户被删除/停用,我的服务帐户会发生什么

  10. 10

    如果链接到目标文件但不使用任何代码,会发生什么?

  11. 11

    如果不使用Http响应并且未关闭连接会发生什么?

  12. 12

    css 和 scss - 如果不使用 scss 手动更新 css 会发生什么

  13. 13

    如果我在已删除的实体上调用EF Reload,会发生什么情况?

  14. 14

    如果我在分支中存储更改然后删除该分支会发生什么

  15. 15

    如果我在C#应用程序中删除App.config会发生什么?

  16. 16

    如果我在git中删除父分支,子分支会发生什么

  17. 17

    如果我从/ etc / hosts删除此行会发生什么

  18. 18

    如果我在C#应用程序中删除App.config会发生什么?

  19. 19

    如果我删除sources.list.d中的.list文件,会发生什么?

  20. 20

    如果我删除Rabbitmq的“.erlang.cookie”文件会发生什么?

  21. 21

    Ubuntu 18.04 - 如果我删除 /var/log/syslog 会发生什么?

  22. 22

    如果我删除了 C++ 程序正在向其写入数据的文件,会发生什么?

  23. 23

    为什么UNPKG是免费使用的,如果我使用过度,会发生什么?

  24. 24

    #import是什么意思?如果我们使用#include会发生什么?

  25. 25

    如果不删除EventListener(JavaScript),会发生什么?

  26. 26

    如果不删除 docker 中的网络会发生什么?

  27. 27

    如果我通过传递blob使用resultet.getString()会发生什么?

  28. 28

    如果我在Node.js服务器中使用socket.setKeepAlive会发生什么

  29. 29

    如果我在ReactJS或React Native的类的构造函数中使用setState()函数,将会发生什么?

热门标签

归档