我见过人们使用带有两个'!'的条件子句的代码
#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)吗?
如果我有一些像这样的枚举
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,而不是必须检查每个可能组中的每个项目.
或者除了使用枚举之外,还有更有效的方法吗?
提前致谢
我的目标是在不阻塞主线程(GUI)的情况下从串行设备接收消息,并尝试将平台相关逻辑(GUI和串行端口)与业务逻辑(处理消息)分开,以便于移植到其他平台
上下文:我正在使用 Qt 和 QtSerialPort 模块。消息协议很简单,每条消息都用0xff来结束。
到目前为止我找到了4种解决方案:
方法一:
使用一个线程读取串行端口并填充缓冲区
使用另一个线程读取缓冲区,提取有效消息(进入另一个缓冲区?还不知道这将如何工作)
使用另一个线程来解析消息
方法二:
使用一个线程读取串行端口,并将有效消息提取到缓冲区中
使用另一个线程来解析消息
方法三:
方法四:
方法 1,2 和 3 的不同之处在于一般工作负载划分为的线程数量,但我不知道哪一个最好。
我目前正在使用方法 4,该方法效率极低,并且在低端计算机上效果不佳,因为产生了大量线程,并且每次我移动 GUI 或与 GUI 交互时,串行通信都会停止。为每条消息生成一个线程也会使消息的顺序不确定,到目前为止这还不是一个主要问题......
是否还有其他方法,每种方法的优点(如果有)和缺点是什么,哪种方法最好?谢谢!
编辑:在主线程中处理消息的一个问题是与 GUI 交互(甚至移动窗口)会阻塞消息处理功能。有没有办法解决?