跳到主要内容

事件(Event):VS Code 通知插件「 something 变了」

事件是什么​

和 命令(用户点一下触发一次)不同,事件是 VS Code 在状态变化时 反复通知 Extension Host:「配置改了」「这个侧栏视图显示/隐藏了」等。

用法固定模式:在某个对象上调用 .onDidXxx(回调),返回 Disposable,放进 context.subscriptions。

通信方向:VS Code → Extension Host → 你的回调函数。


本项目用到的 VS Code 事件​

1. vscode.workspace.onDidChangeConfiguration​

做什么:用户在「设置」里改了任意配置项时触发;回调参数里可以判断是不是本插件关心的键。

在哪里:src/extension.ts

const configChangeDisposable = vscode.workspace.onDidChangeConfiguration(
(event) => {
if (
!event.affectsConfiguration("hardwareCoreMonitor.refreshIntervalMs")
) {
return;
}

monitorService.updateInterval(getRefreshIntervalMs());
},
);

通信过程:

  1. 用户在设置 UI 修改 hardwareCoreMonitor.refreshIntervalMs(键在 package.json → contributes.configuration 里定义)。
  2. VS Code 保存 settings,向 Extension Host 发配置变更事件。
  3. event.affectsConfiguration("hardwareCoreMonitor.refreshIntervalMs") 为 true 时,重新 getRefreshIntervalMs() 并传给 monitorService.updateInterval。

读配置的具体 API 见 04-configuration.md。


2. treeView.onDidChangeVisibility​

做什么:用户打开/关闭、或切换到别的侧栏视图,导致 本插件这棵树的视图区域显示或隐藏 时触发。event.visible 为 true 表示现在看得见。

在哪里:src/extension.ts,对象来自 createTreeView 的返回值。

先创建树视图:

const treeView = vscode.window.createTreeView(
"hardware-core-monitor.sidebarView",
{ treeDataProvider: treeProvider },
);

再监听可见性:

treeView.onDidChangeVisibility(
(event) => syncMonitoringWithSidebarVisibility(event.visible),
undefined,
context.subscriptions,
);

syncMonitoringWithSidebarVisibility 的逻辑:

const syncMonitoringWithSidebarVisibility = (visible: boolean): void => {
if (visible) {
monitorService.updateInterval(getRefreshIntervalMs());
monitorService.start();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
true,
);
return;
}

monitorService.stop();
void vscode.commands.executeCommand(
"setContext",
MONITORING_CONTEXT,
false,
);
};

通信过程:

  • 侧栏 可见 → 启动采集、并把 hardwareMonitorIsRunning 设为 true(标题栏显示 Pause)。
  • 侧栏 不可见 → 停止采集、上下文设为 false(标题栏显示 Play)。

扩展刚激活时如果侧栏已经开着,会立刻同步一次:

if (treeView.visible) {
syncMonitoringWithSidebarVisibility(true);
}

本项目里的「插件自己发的事件」(给下一节对照)​

下面不是 VS Code 发来的,而是 MonitorService / TreeProvider 在 Extension Host 内部 用的同一套 EventEmitter API,见 06-internal-event-bus.md:

API文件谁监听
monitorService.onDidChangeSnapshotmonitorService.ts / extension.ts树、状态栏、告警
hardwareTreeProvider.onDidChangeTreeDatahardwareTreeProvider.tsVS Code 树视图(拉取新数据)

区分方式:

  • 订阅 vscode.xxx.onDid... → VS Code 推给你。
  • 订阅 monitorService.onDidChangeSnapshot → 本插件别的模块推给你。
  • 实现 onDidChangeTreeData 并 fire → 你推给 VS Code,让它刷新树。

context.subscriptions 与事件​

onDidChangeConfiguration 和 onDidChangeVisibility 的第三个参数传了 context.subscriptions,VS Code 会在扩展停用时自动取消订阅。

configChangeDisposable 也手动 push 进了 subscriptions(见 extension.ts 末尾),效果相同:避免重复激活后注册多份监听。