大脑
大脑构成
- 本能脑,形成时间最久,3.6 亿年
- 情绪脑,形成时间两亿年
- 理智脑,最年轻,话语权也最小
我们要尽可能的开发理智脑,但是不是通过单纯的毅力去克服,而是要提升认知,让理智脑去说服本能脑和情绪脑。如何训练理智脑:
- 立足长远
- 克制风险
- 保持耐心
- 抵制诱惑
下载 boost 压缩包,并解压
运行 booststrap.bat 批处理文件,这个文件会生成 b2.exe
b2.exe
是 Boost Build 工具的可执行文件,Boost Build 是用于构建 Boost 库以及基于 Boost 开发的项目的工具,它在 Boost 生态系统中扮演着重要角色,主要功能如下:
- 编译 Boost 库:Boost 库包含大量的功能模块,如字符串处理、线程支持、智能指针等。
b2.exe
能够根据不同的平台(Windows、Linux、macOS 等)和编译选项,将 Boost 库的源代码编译成相应的库文件(静态库或动态库)。例如,在 Windows 系统上,使用b2.exe
可以生成.lib
(静态库)和.dll
(动态库)文件,方便在项目中使用 Boost 库的功能。- 定制编译选项:允许开发者根据需求定制 Boost 库的编译行为。可以指定要编译的 Boost 模块,选择不同的优化级别、调试信息生成方式等。比如,开发者可以只编译项目中实际需要的 Boost 模块,以减少编译时间和库文件的大小。
- 构建基于 Boost 的项目:除了编译 Boost 库本身,
b2.exe
也可用于构建使用了 Boost 库的项目。它能够识别项目中的源文件、头文件以及与 Boost 库的依赖关系,按照正确的顺序进行编译和链接,生成可执行文件或其他目标产物。
使用 b2.exe 编译的时候可以指定编译参数
Reliable EMG decomposition technique is very importance for understanding the neurophysiology, diagnosis and tracking the progress of motor neuron diseases or neuromuscular disorders [11], [26], [29]. In this article, a novel sEMG decomposition algorithm specifically suitable for dynamic contraction was proposed. By combining the NMF and LMMSE, the EFT was firstly extracted from the eigenvector matrix. Then the firing instants of each EFT were classified into MUs according to their specific 3D space positions.
分为两个线程,分别是采集线程和绘制线程。
采集线程面向过程,从buffer(C风格数组)中读取数据,并写入txt文本文件中。数据采集卡需要读取三个通道,分别代表编码器的 A 相,编码器的 B 相,以及同步信号。缓冲区的数据是同一时刻三个通道的数据是相邻的。然后通过 A 相和 B 相的脉冲数计算转过的角度,A 相在 B 相前角度就是正,A 相在 B 相后角度就是负。记录当前时间与开始时间的差值,作为绘制的 x 坐标,记录当前的角度,作为 y 坐标。这个 x 坐标和 y 坐标是 samplingForce 这个对象的成员变量。
ui 线程通过访问这个 samplingForce 的类成员来获取绘制的点。这中间涉及到线程安全问题以及面向对象的问题。
std::shared_ptr
是 C++ 标准库中的一个智能指针,用于自动管理对象的生命周期。它通过引用计数来跟踪有多少个 shared_ptr
指向同一个对象。当最后一个 shared_ptr
被销毁或重置时,对象也会被删除。
std::shared_ptr
的底层实现通常包括以下几个关键组件:
use_count
)记录了多少个 shared_ptr
指向同一个对象。weak_count
)记录了多少个 std::weak_ptr
持有对该对象的引用。std::shared_ptr
包含一个指向控制块的指针。ChatServer 同时兼具两种服务器的功能,一种是 TCP 服务器,用于聊天,一种是 gRPC 服务器,用于消息的转发。
所以初始化的时候就需要两种初始化,分别跑在不同的线程里。之前是让 ioc.run() 单独跑在一个线程里的,这次让 gRPC 的监听单独跑在一个线程里:
1 | ChatServiceImpl service; |
StatusServer 主要用作 GateServer 的 gRPC 服务器以及 ChatServer 的 gRPC 的客户端。
主函数是如何初始化 gRPC 服务器的?
在主函数里面,只需要启动 gRPC 的服务端就可以了。作为服务端,肯定是要一直处于监听状态,那么就需要一个上下文和一个监听端点:
这里的端点就是服务器自己设定的端口号,在 init 文件初始化的 50052,而 IP 是所有地址的 IP 都可以监听,所以是 0.0.0.0,这样 IP 和 Port 组成了一个地址(端点)传给这个 builder。
这里的上下文和客户端的 ClientContext 有区别,用的是 builder 来开始和监听服务的。而服务的具体实现需要通过一个类来实例化,这个实例包含了 proto 文件中定义的 rpc 接口。
首先来看如何实现这个服务接口的。StatusServer 定义了两个 gRPC 接口: