当前位置: 首页 > article >正文

期货软件开发「启动加载页 / 初始化窗口」

一、初始化窗口作用• 程序刚打开时显示• 后台连接行情服务器• 加载历史 K 线 / 行情数据• 加载完成后自动进入主界面二、当前已实现的核心功能1. 窗体基础功能• 无边框拖动顶部栏按住可移动窗口• 最小化按钮 •关闭按钮• 基于 Sunny.UI 样式的界面2. 初始化与线程加载• 窗体一打开自动启动后台线程• 线程里调用 Common.Init() 初始化行情系统• 把当前窗口句柄传给底层用于接收消息• 线程设为后台线程程序退出自动结束3. Windows 消息接收1. WM_SHOW_INFO显示提示文字加载中…2. WM_NET_MSG_HQ接收行情服务器的网络消息这是 C# 与 C 底层 / 行情接口 通信的标准方式。4. 行情网络消息处理最关键 当前能处理这些服务器消息① 连接状态 • msg1开始加载数据 / 连接失败 • msg2服务器断开② 数据推送msg3• cmd2心跳包保持连接• cmd10实时行情推送• cmd11K 线数据推送• cmd102历史行情请求返回• cmd103正在下载历史 K 线 → 显示 “正在加载数据 {合约代码}”• cmd104历史数据全部下载完成 → 显示 “数据加载完成”并返回 DialogResult.OK → 自动关闭并进入主程序• cmd105补充行情数据• cmd106补充数据下载完成5. 安全更新 UI• 封装了 UpdateControlSafely()• 跨线程更新标签文字不会报错、不会卡死6. 异常保护• 所有消息处理都包了 try-catch• 出错会弹出提示不会导致整个程序崩溃 7. 资源释放• 窗体关闭时尝试终止加载线程• 避免线程泄漏namespace newQiHuo { public partial class FrmInit : Form { private Thread _loadDataThread; // 保存线程引用 private CancellationTokenSource _cts; // 线程取消令牌源替代Abort // 定义结构体补充代码完整性实际项目中应该在公共区域定义 public struct ST_NetMsg { public int msg; // 消息类型 public int datalen; // 数据长度 public string data; // 数据内容 // 补充其他必要字段... } public FrmInit() { InitializeComponent(); _cts new CancellationTokenSource(); // 初始化取消令牌 } private void FrmInit_Load(object sender, EventArgs e) { Common.gRecvHQNetMsgHandle this.Handle; // 初始化线程并设置为后台线程 _loadDataThread new Thread(() InitLoadData(this.Handle, _cts.Token)); _loadDataThread.IsBackground true; // 后台线程程序退出时自动终止 _loadDataThread.Start(); } // 初始化加载数据线程增加取消令牌支持 private static void InitLoadData(IntPtr handle, CancellationToken token) { try { Common.Init(handle); // 轮询取消信号优雅退出 while (!token.IsCancellationRequested) { Thread.Sleep(100); // 避免空循环占用CPU } } catch (OperationCanceledException) { // 捕获取消异常正常退出 Common.ShowMsg(数据加载线程已正常终止); } catch (Exception ex) { Common.ShowMsg($数据加载线程异常{ex.Message}); } } protected override void DefWndProc(ref System.Windows.Forms.Message m) { switch (m.Msg) { case Global.WM_SHOW_INFO: // 显示消息 OnShowInfo(m.WParam, m.LParam); break; case Global.WM_NET_MSG_HQ: OnNetMsgHQ(m.WParam, m.LParam); break; default: base.DefWndProc(ref m); break; } } // 安全更新UI控件的通用方法 private void UpdateControlSafely(Action action) { if (this.IsDisposed) return; // 防止窗体已释放时调用Invoke if (this.InvokeRequired) // 判断是否跨线程 { // 使用BeginInvoke避免线程阻塞如果不需要等待UI更新完成 this.BeginInvoke(action); } else { action(); // 已经是UI线程直接执行 } } // 行情网络消息处理 protected void OnNetMsgHQ(IntPtr wParam, IntPtr lParam) { try { // 空指针检查 if (lParam IntPtr.Zero) return; // 从非托管内存解析结构体 ST_NetMsg myNetMsg (ST_NetMsg)Marshal.PtrToStructure(lParam, typeof(ST_NetMsg)); if (myNetMsg.msg 1) { if (myNetMsg.datalen 0) { UpdateControlSafely(() lbInfo.Text 开始加载数据...); } else { Common.ShowMsg(行情服务器连接失败); } } else if (myNetMsg.msg 2) { Common.ShowMsg(行情服务器连接断开); } else if (myNetMsg.msg 3) { string strData myNetMsg.data?.Trim() ?? string.Empty; // 空值保护 if (string.IsNullOrEmpty(strData)) return; // 修复正确的Split用法 - 移除空元素 string[] vec strData.Split(new[] { ; }, StringSplitOptions.RemoveEmptyEntries); if (vec.Length 3) return; string cmd vec[0]; if (cmd 2) // 心跳返回 { } else if (cmd 10) // 实时行情推送 { string code vec[1]; string timeStamp vec[2]; } else if (cmd 11) // K线推送 { } else if (cmd 102) // 获取历史行情请求返回 { string errCode vec[1]; string errMsg vec[2]; } else if (cmd 103) // 历史行情数据 { if (vec.Length 12) return; string code vec[1]; string timeStamp vec[2]; string period vec[3]; // 安全更新UI UpdateControlSafely(() lbInfo.Text $正在加载数据 {code}); } else if (cmd 104) // 历史数据下载完成 { if (vec.Length 3) return; string errCode vec[1]; string errMsg vec[2]; Common.gKlineHistoryManage.DownloadHistoryFinished(); // 安全更新UI并设置DialogResult UpdateControlSafely(() { lbInfo.Text 数据加载完成; this.DialogResult DialogResult.OK; }); } else if (cmd 105) // 补充数据 { if (vec.Length 12) return; string code vec[1]; string timeStamp vec[2]; string period vec[3]; } else if (cmd 106) // 补充数据下载完成 { if (vec.Length 7) return; string errCode vec[1]; string errMsg vec[2]; string code vec[3]; string period vec[4]; } } } catch (Exception ex) { // 异常捕获避免消息处理崩溃 Common.ShowMsg($行情消息处理出错{ex.Message}); } } // 显示消息 protected void OnShowInfo(IntPtr wParam, IntPtr lParam) { try { if (lParam IntPtr.Zero) return; // 空指针检查 ST_NetMsg myNetMsg (ST_NetMsg)Marshal.PtrToStructure(lParam, typeof(ST_NetMsg)); string strInfo myNetMsg.data ?? string.Empty; // 安全更新UI UpdateControlSafely(() lbInfo.Text strInfo); } catch (Exception ex) { Common.ShowMsg($信息显示出错{ex.Message}); } } private void butMin_Click(object sender, EventArgs e) { this.WindowState FormWindowState.Minimized; } private void butclos_Click(object sender, EventArgs e) { this.Close(); } private Point formPoint; private void Toptaskbar_MouseDown(object sender, MouseEventArgs e) { formPoint new Point(e.X, e.Y); } private void Toptaskbar_MouseMov(object sender, MouseEventArgs e) { if (e.Button MouseButtons.Left) { this.Location new Point(this.Location.X e.X - formPoint.X, this.Location.Y e.Y - formPoint.Y); } } // 窗体关闭时释放资源 protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); // 优雅取消线程替代Abort if (_cts ! null) { _cts.Cancel(); _cts.Dispose(); } // 等待线程结束可选根据实际需求 if (_loadDataThread ! null _loadDataThread.IsAlive) { // 最多等待1秒避免程序卡死 _loadDataThread.Join(1000); _loadDataThread null; } } // 窗体释放时的清理 protected override void Dispose(bool disposing) { if (disposing) { _cts?.Dispose(); components?.Dispose(); } base.Dispose(disposing); } } // 补充必要的公共类定义实际项目中应该在单独文件 public static class Common { public static IntPtr gRecvHQNetMsgHandle; public static KlineHistoryManage gKlineHistoryManage new KlineHistoryManage(); public static void Init(IntPtr handle) { // 实际初始化逻辑 } public static void ShowMsg(string msg) { // 实际消息显示逻辑 MessageBox.Show(msg); } } public class KlineHistoryManage { public void DownloadHistoryFinished() { // 实际逻辑 } } public static class Global { public const int WM_SHOW_INFO 0x0400 100; // 自定义消息 public const int WM_NET_MSG_HQ 0x0400 101; } }

相关文章:

期货软件开发「启动加载页 / 初始化窗口」

一、初始化窗口作用:• 程序刚打开时显示• 后台连接行情服务器• 加载历史 K 线 / 行情数据• 加载完成后自动进入主界面 二、当前已实现的核心功能1. 窗体基础功能• 无边框拖动(顶部栏按住可移动窗口)• 最小化按钮 •关闭按钮• 基于 …...

供应链产研交付提效:后端开发提效实战

引言 在传统后端开发流程中,需求解析、接口开发、测试验证、部署上线等环节存在大量重复性工作,且需求变更易导致研发成本上升、交付周期延长。为解决这一痛点,本文围绕后端开发提效展开全维度规划,从架构设计、分阶段落地计划、核…...

洛谷P8218 【深进1.例1】求区间和 考点:一维前缀和

题目 P8218 【深进1.例1】求区间和 - 洛谷 核心思路 一维前缀和模板题 代码 可以让AI总结一下代码逻辑 这段代码实现了一维前缀和算法,用于高效解决区间求和问题。主要逻辑如下: 预处理 (数据输入与求和): 读取数组长度 n。在读取每个元…...

SGP.22 eSIM通信原理-打电话

三个关键阶段:准备阶段(下载Profile)、激活阶段(网络注册)和使用阶段(拨打电话)。 第一阶段:准备——将中国移动的“身份”下载到手机 用户买了一部支持eSIM的新手机,决定…...

Python自动化实现思路

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快Python自动化实现思路通常分为以下几步1. 确定自动化测试的范围和目标:首先需要明确需要进行自动化测试的范围和目标,包括测试场景、测试用…...

S款直流一体机模块问题排查指导

S款直流一体机模块问题排查指导一、问题现象:现场S款直流一体机设备启动时报错:绝缘检测超时,请插拔充电桩。或者事件内有模块的相关报错,比如:直流模块通讯故障,直流模块输出故障等。图一:启动…...

双有源桥式DC-DC变换器仿真及Matlab建模实践:自行设定输入输出电压值与基础讲解

双有源桥式dcdc变换器仿真 dab变换器Matlab仿真模型 自行设计输入输出电压值 配基础讲解一份双有主动桥(DAB)变换器这个拓扑结构就像两个武林高手在推手——输入侧的H桥和输出侧的H桥通过高频变压器连接,通过调节两者的相位差来控制能量流动。…...

CGAL ::Surface Mesh 参考文档examples详解

1 引言 CGAL::Surface_mesh 是 CGAL 中用于表示多面体表面的半边数据结构(Halfedge Data Structure, HDS),是传统指针式半边结构和3D 多面体表面的轻量化替代方案,核心优势是基于整数索引而非指针,兼顾内存效率、易用…...

膜结构车棚性价比排名深度解析

在停车设施领域,膜结构车棚凭借其独特优势逐渐成为热门选择。下面将深入分析膜结构车棚性价比相关因素。性能优势凸显性价比膜结构车棚以高强度建筑膜材为覆盖材料,配合钢结构支撑。其膜材有 PVC/PVDF 涂层聚酯膜、PTFE 膜等。它具有诸多性能优势&#x…...

实验室纯水机怎么选?2026 纯水系统品牌及选型全攻略

在实验室筹建或设备更新时,面对琳琅满目的品牌和参数,“怎么选”往往比“买不买”更令人头疼。选错设备,轻则耗材成本高昂,重则导致实验结果偏差、质谱基线不稳。要选对实验室纯水机,建议按照以下“四步筛选法”进行决…...

(新界面)NVR即时回放功能操作指导

(新界面)NVR即时回放功能操作指导一、功能介绍对系统当前时间点之前5分钟(可自定义,默认5分钟)内的录像进行回放,方便在预览实况时发现异常并即时回放。旧版本NVR需升级至NVR-BXXXX.50.13.250529或更高版本…...

技术人的困境:参数碾压对手,客户却不选你?用“技术路线图叙事”破局

作为技术出身的B2B从业者,你可能一直坚信:技术够硬,就是最好的销售语言。你带着PPT去见客户,第一页:屈服强度对比图,比竞争对手高15%;第二页:专利清单,密密麻麻排了三页&…...

求推荐超绝高性价比的GEO优化公司

一直以来,传统SEO投放大量网络资源却难以让用户精准找到品牌,且严重依赖搜索框、时效慢、流量少等问题,是当前行业普遍面临的难题。倍霖卓越推出的倍霖GEO针对这一问题提供了专业解决方案。倍霖GEO系统,采用多类型多平台全方位内容…...

IonicSelect组件使用指南

ionic select 基础用法ionic select 组件允许用户从一组选项中选择一个或多个值。基本用法需要在 ion-select 标签内嵌套 ion-select-option 标签。<ion-select placeholder"选择水果"><ion-select-option value"apple">苹果</ion-select-o…...

用大白话解释Sub-Agents

用大白话解释 Sub-Agent 就是"被派出去干活的 Claude 分身"。最直白的比喻 想象你是一个包工头&#xff08;主 Claude&#xff09;&#xff1a;你接到一个装修任务&#xff0c;但你不可能同时贴瓷砖、刷墙、装电路。 所以你派出三个工人去分别干这三件事&#xff1a;…...

【研报221】2026年汽车零部件行业投资策略研究:智驾平权+人形机器人量产趋势

本报告提供限时下载&#xff0c;请查看文后提示以下仅为报告部分内容&#xff1a;此报告全面解析汽车零部件行业2026年的发展趋势与投资机会。2025年行业受益于乘用车销量增长&#xff0c;零部件板块收入同比8.3%&#xff0c;其中智能化赛道表现最优&#xff0c;收入增速达20.0…...

【漏洞赏金猎人必看】竞态条件漏洞:从概念到实战,一文讲透(含挖掘技巧)

【漏洞赏金猎人必看】竞态条件漏洞&#xff1a;从概念到实战&#xff0c;一文讲透&#xff08;含挖掘技巧&#xff09; 本文将带你从 0 到 1 彻底理解竞态条件漏洞&#xff0c;并学会在 SRC 和赏金平台中高效挖掘这类高价值漏洞。 我会用最通俗的方式&#xff0c;教你如何判断一…...

进程间通信之管道(匿名管道 + 命名管道)详解

作为进程间通信&#xff08;IPC&#xff09;的基础方式&#xff0c;管道是 Linux/Unix 系统中最经典的 IPC 实现&#xff0c;本文从原理、接口、特性、应用场景等维度&#xff0c;讲讲匿名管道和命名管道。一、管道的核心本质先明确一个核心结论&#xff1a;管道的本质是内核提…...

这里藏着动态参数的小把戏

锂电池soc估计 ekf算法 在线估计&#xff0c;动态参数滚动优化&#xff0c;精度为0.01最近在折腾锂电池管理系统&#xff0c;发现SOC&#xff08;State of Charge&#xff09;估计真是个磨人的小妖精。尤其是要在动态工况下保持0.01的精度&#xff0c;传统的开路电压法直接跪了…...

基因编辑武汉伯远

基因编辑是一种利用工程化核酸酶&#xff08;如CRISPR/Cas9&#xff09;精准修改生物基因组的技术&#xff0c;可实现基因敲除、插入、替换或调控&#xff0c;常用于功能验证、疾病模型和育种改良。核心原理 CRISPR/Cas9系统模拟细菌免疫机制&#xff1a;sgRNA&#xff08;单导…...

HCNR201隔离运放电路

芯片简介HCNR201是一款高线性度模拟光耦&#xff0c;核心作用是实现模拟信号的精确隔离传输&#xff0c;同时保证信号不失真&#xff0c;内部包含1个发光二极管(LED)和2个紧密匹配的光电二极管(PD1, PD2)。电路解析以数据手册示例电路举例下面通过数据手册给出的关键参数&#…...

荣耀远航计划丨主题精品共创激励更新

...

OpenClaw 安装配置全记录

OpenClaw 安装配置全记录 &#x1f4dd; 前言 本文档记录了在 Windows 环境下安装和配置 OpenClaw 的全过程&#xff0c;包括遇到的问题、解决方案。希望能帮助其他遇到类似问题的朋友。一、环境准备 1.1 系统要求 操作系统&#xff1a;Windows 10/11Node.js&#xff1a;22.x 或…...

指针类型:C语言内存安全的关键

指针变量类型的作用 C语言中指针变量要求类型的主要原因在于类型系统对内存操作的安全性和效率保障。指针的类型决定了它指向的内存区域如何被解释&#xff0c;以及指针运算的行为。 内存访问的正确性 指针类型明确了所指向数据的类型和大小。例如&#xff0c;int*指针指向一个…...

开源OpenClaw部署指南

1. 引言当前&#xff0c;人工智能和机器人技术正迅猛发展。作为自动化操作的关键部件&#xff0c;机械夹爪在工业生产、医疗康复和服务机器人等领域发挥着重要作用。Open Claw采用开源设计理念&#xff0c;突破了传统夹爪的技术限制&#xff0c;显著降低了研发和应用门槛。这种…...

Boost源码分析: Serialization

本文梳理Boost.Serialization代码的实现原理。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 一、概述 二、核心组件 2.1 boost::archive::detail::interface_oarchive // include\boost\archive…...

院墙上的监控成摆设?避开这三个坑,不给骗子留机会!室外监控摄像头哪个品牌好

回村发现一个扎心现象&#xff1a;家家户户院墙上都挂着监控&#xff0c;可大半都是“中看不中用”的摆设。不少流动商贩专挑农村老人下手&#xff0c;凭着几句忽悠&#xff0c;就让老人花几千块买劣质监控&#xff0c;实则全是收割养老钱的套路——农村户外监控&#xff0c;早…...

Flutter 三方库 rabbit_converter 的鸿蒙化适配指南 - 让消息转换回归“工业化标准”,打造鸿蒙应用专家级的 RabbitMQ 数据适配中台

欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net Flutter 三方库 rabbit_converter 的鸿蒙化适配指南 - 让消息转换回归“工业化标准”&#xff0c;打造鸿蒙应用专家级的 RabbitMQ 数据适配中台 前言 在鸿蒙&#xff08;OpenHarmony&…...

原儿茶醛市场洞察:2026 - 2032年复合增长率(CAGR)为4.6%

2025 - 2032全球原儿茶醛市场洞察&#xff1a;需求驱动下的增长与挑战据恒州诚思调研统计&#xff0c;2025年全球原儿茶醛收入规模约达1.74亿元&#xff0c;至2032年这一规模将接近2.39亿元&#xff0c;2026 - 2032年复合增长率&#xff08;CAGR&#xff09;为4.6%。原儿茶醛&a…...

Flutter 三方库 icc_parser 的鸿蒙化适配指南 - 高效解析 ICC 颜色配置文件,精准还原跨平台色彩表现

欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net Flutter 三方库 icc_parser 的鸿蒙化适配指南 - 高效解析 ICC 颜色配置文件&#xff0c;精准还原跨平台色彩表现 前言 在现代移动应用开发中&#xff0c;色彩的准确性对于提升 UI 质感和用…...