调用UHD的C++程序致后启动X转发PyQt应用挂起问题排查
问题:UHD初始化后PyQt GUI无法在SSH X转发环境启动
项目背景
- 基于Ettus Research X440电台开发项目,底层依赖UHD API
- 核心组件:
- C++模块:处理所有UHD/USRP调用,以及电台与流端点的高速接口
- Python脚本(NiceGUI):向C++模块发送命令,控制USRP行为
- Python脚本(PyQt):通过ZMQ接收低速率样本,展示基础频谱分析视图
- 运行环境:无头RHEL9服务器,通过SSH远程访问并启用X转发
问题现象
- 若在C++模块调用
uhd::usrp::multi_usrp::make()之前启动PyQt频谱脚本:GUI正常弹出,X转发窗口可正常交互,UHD初始化完成后仍能继续运行 - 若在C模块调用该函数之后启动PyQt脚本:脚本执行到打印"Done here"的初始化步骤,但窗口始终不显示;无法通过CTRL-C终止脚本,只有终止C应用后,GUI才会立刻弹出
怀疑方向
X440数据速率较高,UHD底层使用DPDK,推测问题出在系统层面,Python侧调试无法定位原因
复现代码
最简PyQt GUI代码
from pyqtgraph.Qt import QtWidgets, QtCore class myGui(QtWidgets.QWidget): def __init__(self): super().__init__() # Layout layout = QtWidgets.QVBoxLayout(self) ctrl_layout = QtWidgets.QHBoxLayout() layout.addLayout(ctrl_layout) print("Done here") # 若在C++应用后启动,该行会打印但窗口不显示 def main(): print("main") app = QtWidgets.QApplication([]) gui = myGui() gui.resize(1200, 900) gui.show() app.exec() if __name__ == "__main__": main()
导致挂起的最简C++代码
#include <uhd/convert.hpp> #include <uhd/usrp/multi_usrp.hpp> #include <uhd/utils/safe_main.hpp> #include <uhd/utils/thread.hpp> #include <boost/algorithm/string.hpp> #include <iostream> #include <chrono> #include <thread> int UHD_SAFE_MAIN(int argc, char* argv[]) { // minimal config for demonstration uhd::usrp::multi_usrp::sptr usrp_; std::cout << "Before usrp, waiting 20 seconds" << std::endl; // 此阶段启动GUI不会挂起 std::this_thread::sleep_for(std::chrono::seconds(20)); std::cout << "Making USRP" << std::endl; usrp_ = uhd::usrp::multi_usrp::make("addr=192.168.10.2, second_addr=192.168.20.2," "mgmt_addr=192.168.200.2,use_dpdk=1, master_clock_rate=500e6," "converter_clock_rate=4e9"); std::cout << "Finished making USRP, waiting 20 seconds" << std::endl; // 此阶段启动GUI会挂起 std::this_thread::sleep_for(std::chrono::seconds(20)); return 0; }
内容的提问来源于stack exchange,提问作者cawald_18
相关产品推荐
相关产品推荐

