小编A P*_*son的帖子

为什么用!!(条件)代替(条件)?

我见过人们使用带有两个'!'的条件子句的代码

#define check_bit(var, pos)       (!!((var) & (1 << (pos))))
#define likely(x)       __builtin_expect(!!(x),1)
#define unlikely(x)     __builtin_expect(!!(x),0)
Run Code Online (Sandbox Code Playgroud)

是我能找到的一些例子.

使用!!(condition)结束有什么好处(condition)吗?

c logical-operators

35
推荐指数
2
解决办法
2285
查看次数

在C中"分组"枚举值

如果我有一些像这样的枚举

typedef enum {
    AN_TRISTATE_0,
    AN_TRISTATE_1,
    AN_NOTHING,
    AN_MOTOR_1,
    AN_MOTOR_2,
    AN_MOTOR_3,
    AN_SENSOR_1,
    AN_SENSOR_2,
    AN_SENSOR_3,
    AN_SENSOR_4,
    AN_SENSOR_5
} adc_pin_func_t;
Run Code Online (Sandbox Code Playgroud)

adc_pin_func_t a_particular_pin = ...
Run Code Online (Sandbox Code Playgroud)

是否有可能检查引脚是否属于特定组,例如引脚是其中的一部分AN_MOTOR或部分AN_SENSOR,而不是必须检查每个可能组中的每个项目.

或者除了使用枚举之外,还有更有效的方法吗?

提前致谢

c enums

15
推荐指数
1
解决办法
1020
查看次数

Qt 串口的 C++ 线程模式

我的目标是在不阻塞主线程(GUI)的情况下从串行设备接收消息,并尝试将平台相关逻辑(GUI和串行端口)与业务逻辑(处理消息)分开,以便于移植到其他平台

上下文:我正在使用 Qt 和 QtSerialPort 模块。消息协议很简单,每条消息都用0xff来结束。

到目前为止我找到了4种解决方案:

方法一:

  1. 使用一个线程读取串行端口并填充缓冲区

  2. 使用另一个线程读取缓冲区,提取有效消息(进入另一个缓冲区?还不知道这将如何工作)

  3. 使用另一个线程来解析消息

方法二:

  1. 使用一个线程读取串行端口,并将有效消息提取到缓冲区中

  2. 使用另一个线程来解析消息

方法三:

  1. 使用一个线程读取串行端口,提取有效消息,并阻塞直到该消息被处理,利用 QtSerialPort 的内部读取缓冲区来缓冲传入数据

方法四:

  1. 使用主线程异步读取串口,提取有效消息,并为每条消息生成一个新线程来处理它们

方法 1,2 和 3 的不同之处在于一般工作负载划分为的线程数量,但我不知道哪一个最好。

我目前正在使用方法 4,该方法效率极低,并且在低端计算机上效果不佳,因为产生了大量线程,并且每次我移动 GUI 或与 GUI 交互时,串行通信都会停止。为每条消息生成一个线程也会使消息的顺序不确定,到目前为止这还不是一个主要问题......

是否还有其他方法,每种方法的优点(如果有)和缺点是什么,哪种方法最好?谢谢!

编辑:在主线程中处理消息的一个问题是与 GUI 交互(甚至移动窗口)会阻塞消息处理功能。有没有办法解决?

c++ qt multithreading

2
推荐指数
1
解决办法
7685
查看次数

标签 统计

c ×2

c++ ×1

enums ×1

logical-operators ×1

multithreading ×1

qt ×1