Delphi IdTCPClient.连接线程化时挂起

wn9m85ua  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(268)

我正在尝试运行8个线程,使IdTCPClient重复扫描一个IP范围。当这些线程运行时,主窗体挂起,滞后。“IdTCClient.connect”是问题所在。有办法解决吗?

  1. unit Unit3;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  6. type
  7. TTcpThread = class(TThread)
  8. Idx: word;
  9. procedure Execute; override;
  10. end;
  11. TForm3 = class(TForm)
  12. procedure FormShow(Sender: TObject);
  13. private
  14. public
  15. end;
  16. var
  17. Form3: TForm3;
  18. implementation
  19. uses IdTCPClient;
  20. {$R *.dfm}
  21. procedure TTcpThread.Execute;
  22. begin
  23. for var i := Idx*8 to (Idx*8) + (8-1) do // 8 IP per Thread
  24. begin
  25. var TCP := TidTCPClient.Create(nil);
  26. TCP.Host := '192.168.1.' + i.ToString;;
  27. TCP.Port := 9999;
  28. TCP.ConnectTimeout := 500;
  29. TCP.ReadTimeout := 1000;
  30. try
  31. TCP.Connect;
  32. TCP.Disconnect;
  33. except end;
  34. TCP.Free;
  35. end;
  36. end;
  37. procedure TForm3.FormShow(Sender: TObject);
  38. begin
  39. for var i := 0 to 32-1 do // 32 Threads
  40. begin
  41. var Thread := TTcpThread.Create(True);
  42. Thread.Idx := i;
  43. Thread.FreeOnTerminate := True;
  44. Thread.Start;
  45. end;
  46. end;
  47. end.

线程运行时主窗体将冻结/滞后

anhgbhbe

anhgbhbe1#

解决此问题的一种方法是使用TIDThreadComponent组件。此组件设计用于在线程中运行任务。
使用此组件,您可以为每个IP创建一个线程,然后将IdTCPClient连接代码添加到TIDThreadComponent的OnExecute事件中。这将确保连接代码在单独的线程中运行,因此它不会阻塞主窗体或冻结。
解决此问题的另一种方法是使用异步套接字而不是线程。这种方法允许您建立多个连接,而不必为每个连接创建单独的线程。异步套接字比线程更有效,因此在某些情况下是更好的选择。

相关问题