qt 子窗口写到线程就卡死_(五) Qt多线程的使用

2042ade2ccc6130b668f4db49a48ee96.png

先前的文章我们介绍了Qt编写可视化程序的大致框架。现在,我们可以在这个框架的基础上探索如何实现我们想要的功能。在第一篇文章中,我曾说过我的项目需要用FPGA来处理PMT产生的光子信号。这个信号以TTL信号的形式传入FPGA中,而FPGA在计算特定时间内的脉冲数后,会把结果报告给计算机进行后续的处理。

需求分析与程序逻辑设计

读取FPGA上的数据看上去并不困难,因为我们有GetWireOutValue()这个函数可以调用。但什么时候读取FPGA上的数据却是个不小的问题,需要根据应用好好的设计一番。

我的项目中,FPGA会按顺序执行一些序列,每个序列会在对应的端口输出给定的电平并执行给定的时间。FPGA将在最后一个序列执行的过程中对PMT传来的TTL信号进行计数。将计数传给电脑后开启下一个周期,而电脑需要实时地将这些数字显示出来。

显然,我们需要一个结束信号与一个触发信号分别告诉电脑与FPGA什么时候开始读取计数,什么时候该开始执行序列。而FrontPanel所提供的WIRE OUT与TRIGGER IN的API可以很好地接收并发送信号。

于是,一个朴素的想法就是设计一个start按钮,点击的时候执行以下语句:

unsigned 

上述语句不断地读取储存结束信号地址的数据,直到FPGA发出结束信号。此时,可以确定计数结束,开始读取计数,然后将结果送去处理。

编译执行我们的程序,点击start按钮,我们会发现鼠标会变成忙碌的形状,直至获取到FPGA的计数。这意味着这段时间我们窗口啥都没干,就一直在询问FPGA读好数了没。

让程序同时干几件事

上面说的这种方法效率既低,也不美观。我们希望程序在等待FPGA结束信号的同时窗口保持正常工作。事实上我们的窗口正是这么干的,它也不会写个循环语句等待你点击按钮。在Qt中,我们可以通过QThread类实现这一功能。

首先我们可以定义一个Monitor类来干这件事:

class 

然后在window.cpp中我们可以创建一个线程并把monitor扔到里面去运行。由于两个线程独立运行,monitor启动后并不妨碍主线程的运行。并且通过Qt的信号-槽机制可以方便地在接收到数据后把结果报告给主线程处理。

class 

至此,我们成功地给我们的窗口放置了一个监视器监视FPGA的读数变化,从而可以安心处理得到的得到的数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值