1

我正在尝试根据来自 lightstreamer 服务器的遥测重复更新 C++ 中的一些值。该遥测数据是来自国际空间站 (ISSLive) 的实时数据,我将使用它来表达相同的 VR 模拟模型。我已经涵盖了 VR 模拟方面;我只需要数据流方面的帮助。这是代码的公开要点:https ://gist.github.com/connorjak/9f853bb83559976e12c9e38811c3c0af

工作起点

这个项目的起点是ISS-Mimic 项目。这是他们的(工作)架构:

(在树莓派上运行)

  1. Pythondatabase_initialize.py删除然后重新初始化 SQLite3 数据库/dev/shm/iss_telemetry.db
  2. PythonGUI.py建立同目录的SQLite3连接,应用于isolation_level = None连接对象
  3. 在某个时间点GUI.py,一个 Python 子进程被打开ISS_Telemetry.js
  4. NodeJSISS_Telemetry.js与同一目录建立 SQLite3 连接,使用以下行:var db = new sqlite3.Database("/dev/shm/iss_telemetry.db", sqlite3.OPEN_CREATE | sqlite3.OPEN_READWRITE);
  5. ISS_Telemetry.js建立到 lightstreamer 服务器的 LightstreamerClient 连接,使用setSlowingEnabled(false)
  6. ISS_Telemetry.js监听 Lightstreamer 连接并使用新数据更新 SQLite 数据库。
  7. GUI.py继续重复执行选择查询和 fetchall() 以在每个滴答声中获取完整的遥测数据。

非工作当前架构

现在,这是我的架构,主要区别是粗体

(在 Windows 10 1903、WSL 和 Ubuntu 18.04 LTS上运行)

  1. C++ISSLIVE.cpp调用system(...)启动和等待 Pythondatabase_initialize.py
  2. Pythondatabase_initialize.py删除然后重新初始化 SQLite3 数据库/dev/shm/iss_telemetry.db
  3. C++ISSLIVE.cpp建立到同一目录的 SQLite3 连接,不适isolation_level = None用于连接对象(在 C API 中找不到等效功能)
  4. ISSLIVE.cpp调用system(...&)开始而不是等待 NodeJSISS_Telemetry.js
  5. NodeJSISS_Telemetry.js与同一目录建立 SQLite3 连接,使用以下行:var db = new sqlite3.Database("/dev/shm/iss_telemetry.db", sqlite3.OPEN_CREATE | sqlite3.OPEN_READWRITE);
  6. ISS_Telemetry.js建立到 lightstreamer 服务器的 LightstreamerClient 连接,使用setSlowingEnabled(false)
  7. ISS_Telemetry.js监听 Lightstreamer 连接并使用新数据更新 SQLite 数据库。
  8. ISSLIVE.cpp继续重复执行选择查询 ( sqlite3_exec(...)) 以在每个滴答声中获取完整的遥测数据。查询通过回调传递以将所有接收到的表数据打印到 cout

问题

而不是去回调函数并打印任何数据,而是sqlite3_exec(...)返回错误代码 15: PROTOCOL (Locking Protocol error)。这恰好在十秒后发生。

问题

我应该怎么做才能调试这个?我尝试使用 valgrind callgrind 来找出计算违规者,但似乎发生的任何事情都不是计算量大(此代码中花费的计算时间非常短)。

我也可以尝试用另一种架构替换这种架构。我是不是该?我会用什么?我无法更改此数据的源服务器。我之前在cpp-lsclient(Lightstreamer 的 C++ 实现)上遇到了错误。该 repo 似乎只有 lightstreamer 的部分实现。

更多信息

  • isolation_level = None 应该与autocommitSQLite 中的模式相关。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++ 代码,以及高度多线程的仿真平台
4

0 回答 0