You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保每次调用TTetheringManager.AutoConnect时能获知其完成状态?

Delphi Tethering组件AutoConnect重复调用不触发OnEndAutoConnect的解决方法

我开发了一款使用Delphi Tethering组件发送消息的应用。首次调用TetheringManager1.AutoConnect()时,会触发TTetheringManager.OnEndAutoConnect事件,但第二次调用该方法时,尽管能发现并连接新设备,却不会触发此事件。

我需要获知AutoConnect每次调用的完成时机,以此确定何时可以安全地向所有应用发送消息。请问如何实现每次调用AutoConnect时都能获知其完成状态?

相关代码

事件处理代码

procedure TFTetheringTest.TetheringManager1EndAutoConnect(Sender: TObject);
begin
  ConnectionFinished := True;
end;

调用代码(已简化整合)

procedure TFTetheringTest.BtnSendMsgClick(Sender: TObject);
begin
  ConnectionFinished := False;
  TetheringManager1.AutoConnect();
  repeat
    Application.ProcessMessages;
  until ConnectionFinished;
  ConnectionFinished := False;
  // 发送消息
  for var I := 0 to TetheringAppProfileSender.ConnectedProfiles.Count - 1 do
  begin
      TetheringAppProfileSender.SendString(TetheringAppProfileSender.ConnectedProfiles.Items[I], 'msg', 'Test');
  end;
end;

解决方案

1. 重置AutoConnect状态后再调用

TetheringManager首次AutoConnect完成后,内部状态可能未自动重置,导致后续调用不触发结束事件。可以在调用前先取消现有任务:

ConnectionFinished := False;
TetheringManager1.CancelAutoConnect; // 取消可能在运行的自动连接
TetheringManager1.AutoConnect();
repeat
  Application.ProcessMessages;
until ConnectionFinished;

2. 结合OnDiscoveryEnd事件做补充判断

AutoConnect流程包含设备发现阶段,若OnEndAutoConnect未触发,可利用OnDiscoveryEnd事件辅助判断完成状态:

procedure TFTetheringTest.TetheringManager1DiscoveryEnd(Sender: TObject);
begin
  if not TetheringManager1.IsAutoConnecting then
    ConnectionFinished := True;
end;

同时保留原有的OnEndAutoConnect事件处理,覆盖所有完成场景。

3. 改用事件驱动替代循环等待(推荐)

摒弃Application.ProcessMessages的阻塞式等待,直接在连接完成事件中执行消息发送,更贴合Delphi的事件模型:

procedure TFTetheringTest.BtnSendMsgClick(Sender: TObject);
begin
  TetheringManager1.CancelAutoConnect;
  TetheringManager1.AutoConnect();
end;

procedure TFTetheringTest.TetheringManager1EndAutoConnect(Sender: TObject);
begin
  // 连接完成后直接发送消息
  for var I := 0 to TetheringAppProfileSender.ConnectedProfiles.Count - 1 do
  begin
      TetheringAppProfileSender.SendString(TetheringAppProfileSender.ConnectedProfiles.Items[I], 'msg', 'Test');
  end;
end;

内容的提问来源于stack exchange,提问作者Leonard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:53:16