首页 > 解决方案 > Delphi:当与来自另一个线程的数据交互时,如何使 VCL 控件成为线程安全的?

问题描述

在一个单元DeviceManager中,我有formDeviceManager与另一个单元的数据交互的 VCL 表单TThreadDetectDrivesThread. DetectDrivesThread在程序的主窗体中创建和执行。

procedure TDetectDrivesThread.Execute;
begin
  while not Terminated do
  begin
    sleep(1000);
    try
      DetectDrives.refreshRemovableDrivesList(formMain.dbConn);
    finally
    end;
  end;
end;

这是 TDetectDrivesThread 的构造函数:

constructor TDetectDrivesThread.Create();
begin
  inherited Create(false);
  DetectDrives := TDetectDrives.Create(formMain.dbConn);
  FreeOnTerminate := false;
end;

formDeviceManager有几个控件允许用户查看、删除和更改有关此类驱动器的数据。但是,我的控件不是线程安全的,在DetectDrivesThread执行时,我可以使用“删除设备”按钮formDeviceManager来释放与 USB 设备对应的对象。如果该对象的任何方法正在运行,这可能会导致程序崩溃。

标签: multithreadingdelphisynchronizationvcl

解决方案


推荐阅读