是否可以使用 QThread 实现轮询而无需子类化它?

2024-01-18

我有一个类,它是某些设备的抽象。

class Device  
{  
public:  
  ...  
  void Start();  
  void Stop();  
  void MsgLoop();

signals:
  void sMsgArrived();
}  

Start() 和 Stop() 从 GUI 线程调用。 Start() 开始新线程,该线程运行 MsgLoop()。它看起来像这样:

void MsgLoop()  
{
   forever {  
      if(SUCCESS == ReadMsg()) //synchronous, non-blocking
      {
        ProcessMsg(); //quite fast
        emit sMsgArrived(); //this signal is connected with a slot in GUI thread  
      }
   }
}

当调用 Stop() 时,程序应从 MsgLoop() 返回并停止线程。我如何使用 QThread 来实现它而不需要子类化它?


一般来说,您必须决定谁将负责管理线程。是设备还是主窗口?或者可能是一些设备管理器。在您的情况下,设备可能应该管理自己的线程,因此如果您不想子类化它,请使用组合:

class Device : QObject
{
    Q_OBJECT
public:
    Device(QObject * parent = NULL);
    void Start();  
    void Stop();  

private slots:
    void MsgLoop();

signals:
    void sMsgArrived();

private:
    QThread thread;
    bool stopThread;
};


Device::Device(QObject * parent) : QObject(parent)
{
    moveToThread(&thread);
    connect(&thread, SIGNAL(started()), this, SLOT(MsgLoop()));
}

void Device::Start()
{
    stopThread = false;
    thread.start();
}

void Device::Stop()
{
    stopThread = true;
    thread.wait();      // if you want synchronous stop
}

void Device::MsgLoop()
{
  // your loop
  while(!stopThread)
    if(SUCCESS == ReadMsg())
    {
      ProcessMsg();
      emit sMsgArrived();
    }
  QThread::currentThread->quit();
}

注意:只有在以下情况下线程停止才会起作用ReadMsg确实是非阻塞的。如果您稍后决定切换到阻塞读取(这可能适合大多数情况),您将不得不找出另一种方法来停止线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用 QThread 实现轮询而无需子类化它? 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它
  • 如何在c中断言两个类型相等?

    在 C 中如何断言两种类型相等 在 C 中 我会使用 std is same 但搜索 StackOverflow 和其他地方似乎只能给出 C 和 C 的结果 在C中没有办法做到这一点吗 请注意 这不是询问变量是否具有某种类型 而是询问两个类

随机推荐

  • 如何使用 jquery/javascript 在 safari 中复制到剪贴板?

    我研究了一堆答案和文章 它们展示了如何通过 jquery 在按钮单击时复制文本 但没有一个对我有用 我通过 ajax 将一个值附加到 DOM 中 我希望通过单击按钮来复制该值 所有这些解决方案都可以在 chrome 上运行 如果使用 jsf
  • 放弃更改而不从历史记录中删除

    有一个提交不起作用 所以我想放弃它而不将其从历史记录中删除 我已经从早期的修订版中更新并提交 从而创建了一个新的头 我没有分支 我不想要分支 我只想简单地继续使用新的头 就像它原来的样子 没有什么花哨的 没有合并 没有担心 只是继续忘记前一
  • Alexa Skills Kit 输入的“包罗万象”不符合既定意图

    我正在构建一个 Alexa 应用程序 它需要能够处理问题的答案 我有一个SkipIntent具有跳过问题的示例话语的意图 我想建立一个AnswerIntent它可以获取任何答案 并根据正确答案对其进行处理 我尝试使用Amazon LITER
  • 如何在 Java 中检测 SQL 表是否存在?

    如何在 Java 中检测给定 SQL 数据库中是否存在某个表 您可以使用DatabaseMetaData getTables http java sun com j2se 1 5 0 docs api java sql DatabaseMe
  • 何时不在 CakePhp 2.x 中使用可包含行为

    在将 Containable Behaviour 添加到我的各种模型类中几次后 我决定简单地将该行放入 AppModel 中 从而使每个模型都可包含 这让我想知道 是否有任何情况下 特定模型具有可控制行为是不理想的或适得其反的 我想说太少了
  • 更改JLabel的字体

    如何更改JLabel的字体 我尝试这样做但没有成功 JLabel nadpis new JLabel nadpis setFont new Font Papyrus Font ITALIC 100 nadpis setText hi 只是大
  • 将 BasedOn 属性与在不同字典中定义的 Style 结合使用

    我正在开发的应用程序有 2 个 ResourceDictionary DefaultStyles xaml 和 CustomStyles xaml CustomStyles 字典中的样式是否可能使用其他字典中定义的基本样式 默认样式 xam
  • 在一个查询中计算 MySQL 中的多行数

    我目前有一个表 其中存储了多个项目的大量统计信息 例如查看 下载 购买等 要获取每个项目的单个操作计数 我可以使用以下查询 SELECT COUNT FROM stats WHERE operation view GROUP BY item
  • pandas groupby 列并检查组是否满足多个条件

    我有一个如下所示的 DataFrame X Y Date are equal 0 50 0 10 0 2018 08 19 False 1 NaN 10 0 2018 08 19 False 2 NaN 50 0 2018 08 19 Tr
  • Spring Security - 记住我身份验证错误

    我们正在使用 Spring MVC 并遇到以下与 Remember Me 身份验证相关的问题 用户在选中 记住我 的情况下登录 工作正常 perpetitive login 表按预期更新 我们重新启动应用程序服务器 也许是在部署之后等 用户
  • 如何使用 Greasemonkey 更改此 javascript?

    这是脚本
  • 从网络摄像头获取帧的最快方法

    我在用 C Visual studio 开发一个程序时遇到了一点问题 现在我正在努力连接多个网络摄像头 通过 USB 电缆连接 为每个摄像头创建单独的线程来捕获帧 并创建单独的帧用于处理图像 我使用 OpenCV 来处理帧 但问题是我没有获
  • 关闭套接字是否会关闭流?

    我正在遗留的java应用程序中工作 在许多文件中 使用套接字和流 其中套接字被关闭但不是流 是否有必要在关闭套接字之前关闭所有流 因为我收到 打开文件太多错误 这个错误是因为没有关闭流 关闭套接字也会自动关闭流吗 来自Socket Java
  • UICollectionView 装饰视图

    有人为 iOS 6 UICollectionView 实现了装饰视图吗 不可能 查找有关在网络上实现装饰视图的任何教程 基本上在我的应用程序中 我有多个部分 我只想在每个部分后面显示一个装饰视图 这应该很容易实现 但我没有运气 这让我发疯
  • CreateWindowEx 失败并显示 ERROR_CANNOT_FIND_WND_CLASS

    我试图创建一个具有特定类类型 VSDebugger CDataTipWnd 的窗口 但是 当我运行 CreateWindowEx 时它失败 并且 GetLastError 告诉我找不到该类 这是供参考的代码 尽管这并不重要 const Wi
  • 如何在 ffmpeg 中的视频上叠加/放置图像[重复]

    这个问题在这里已经有答案了 大家好 我正在尝试在 ffmpeg 中的视频中心叠加图像 如下所示 ffmpeg i video mp4 i image png filter complex 0 v 1 v overlay 25 25 enab
  • 尽管导入了 stdio,但 getline 未在此范围内声明

    我需要使用getline 在C中 但是当我写 define GNU SOURCE include
  • 无法在 Windows 7 下使用 ProcessBuilder 在 Java 中执行 javac 或其他命令行应用程序

    我正在尝试使用 ProcessBuilder 从 Java 执行 javac 但我没有得到任何输出 也没有任何反应 我尝试读取输入流 因为存在一个错误 如果我不读取它 进程就会挂起 但仍然没有结果 我最初将所有必需的参数传递给 javac
  • Android Youtube Player在Fragment和Activity中导致黑屏

    我需要在 YouTube 播放器中的片段 将其视为片段 A 中加载视频 作为片段中 gridview 的标题 视频加载正常 没有任何问题 但是 如果我单击一个网格项并加载单独的活动 将其视为活动 B 其中也有 YouTube 视频播放器 它
  • 是否可以使用 QThread 实现轮询而无需子类化它?

    我有一个类 它是某些设备的抽象 class Device public void Start void Stop void MsgLoop signals void sMsgArrived Start 和 Stop 从 GUI 线程调用 S