如何确保每次调用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
相关产品推荐
相关产品推荐

