我正在尝试根据来自 lightstreamer 服务器的遥测重复更新 C++ 中的一些值。该遥测数据是来自国际空间站 (ISSLive) 的实时数据,我将使用它来表达相同的 VR 模拟模型。我已经涵盖了 VR 模拟方面;我只需要数据流方面的帮助。这是代码的公开要点:https ://gist.github.com/connorjak/9f853bb83559976e12c9e38811c3c0af
工作起点
这个项目的起点是ISS-Mimic 项目。这是他们的(工作)架构:
(在树莓派上运行)
- Python
database_initialize.py
删除然后重新初始化 SQLite3 数据库/dev/shm/iss_telemetry.db
- Python
GUI.py
建立同目录的SQLite3连接,应用于isolation_level = None
连接对象 - 在某个时间点
GUI.py
,一个 Python 子进程被打开ISS_Telemetry.js
- NodeJS
ISS_Telemetry.js
与同一目录建立 SQLite3 连接,使用以下行:var db = new sqlite3.Database("/dev/shm/iss_telemetry.db", sqlite3.OPEN_CREATE | sqlite3.OPEN_READWRITE);
ISS_Telemetry.js
建立到 lightstreamer 服务器的 LightstreamerClient 连接,使用setSlowingEnabled(false)
ISS_Telemetry.js
监听 Lightstreamer 连接并使用新数据更新 SQLite 数据库。GUI.py
继续重复执行选择查询和 fetchall() 以在每个滴答声中获取完整的遥测数据。
非工作当前架构
现在,这是我的架构,主要区别是粗体。
(在 Windows 10 1903、WSL 和 Ubuntu 18.04 LTS上运行)
- C++
ISSLIVE.cpp
调用system(...)
启动和等待 Pythondatabase_initialize.py
- Python
database_initialize.py
删除然后重新初始化 SQLite3 数据库/dev/shm/iss_telemetry.db
- C++
ISSLIVE.cpp
建立到同一目录的 SQLite3 连接,不适isolation_level = None
用于连接对象(在 C API 中找不到等效功能) ISSLIVE.cpp
调用system(...&)
开始而不是等待 NodeJSISS_Telemetry.js
- NodeJS
ISS_Telemetry.js
与同一目录建立 SQLite3 连接,使用以下行:var db = new sqlite3.Database("/dev/shm/iss_telemetry.db", sqlite3.OPEN_CREATE | sqlite3.OPEN_READWRITE);
ISS_Telemetry.js
建立到 lightstreamer 服务器的 LightstreamerClient 连接,使用setSlowingEnabled(false)
ISS_Telemetry.js
监听 Lightstreamer 连接并使用新数据更新 SQLite 数据库。ISSLIVE.cpp
继续重复执行选择查询 (sqlite3_exec(...)
) 以在每个滴答声中获取完整的遥测数据。查询通过回调传递以将所有接收到的表数据打印到 cout。
问题
而不是去回调函数并打印任何数据,而是sqlite3_exec(...)
返回错误代码 15: PROTOCOL (Locking Protocol error)。这恰好在十秒后发生。
问题
我应该怎么做才能调试这个?我尝试使用 valgrind callgrind 来找出计算违规者,但似乎发生的任何事情都不是计算量大(此代码中花费的计算时间非常短)。
我也可以尝试用另一种架构替换这种架构。我是不是该?我会用什么?我无法更改此数据的源服务器。我之前在cpp-lsclient(Lightstreamer 的 C++ 实现)上遇到了错误。该 repo 似乎只有 lightstreamer 的部分实现。
更多信息
- isolation_level = None 应该与
autocommit
SQLite 中的模式相关。autocommit
模式当前在 C++ 代码中打开;我检查了。 database_initialize.py
在与数据库有关的任何其他内容运行之前完成(并关闭其连接)ISS_Telemetry.js
当 C++ 应用程序关闭时关闭ISS_Telemetry.js
似乎工作正常;数据正常流入。这段代码可能仍然存在问题。- Python 3.6.8
- NodeJS v12.13.1
- npm 6.12.1
- Javascript node-sqlite3 4.1.1(实际的sqlite库版本~3.30)
- C++ sqlite3 3.22.0
- lightstreamer 客户端 7.3.1
- C++14 标准
- 在 pthread 中作为动态链接库运行的 C++ 代码,以及高度多线程的仿真平台