multithreading - Delphi:当与来自另一个线程的数据交互时,如何使 VCL 控件成为线程安全的?
问题描述
在一个单元DeviceManager
中,我有formDeviceManager
与另一个单元的数据交互的 VCL 表单TThread
,DetectDrivesThread
. 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 设备对应的对象。如果该对象的任何方法正在运行,这可能会导致程序崩溃。
解决方案
推荐阅读
- awk - sed 找到正则表达式模式然后找到下一个正则表达式模式(变量多行)并替换
- select - 如何将结果限制为仅包含 BigQuery 中的 UNION Select 语句中一个特定字段唯一的行?
- r - 在 R 中打开 csv 文件
- javascript - 如何在 html 中附加“PHP echo”代码
- python - 从图表中提取平均每日销售额
- java - Gradle 项目无法解决 Resourcenotfoundexception
- python - Python Kivymd - AttributeError 对象没有属性
- ios - 是否可以从 prepareForInterfaceBuilder() 方法发出 url 请求?
- jquery - 尝试在页面加载时打开 select2 会出现错误“在未使用 Select2 的元素上调用了 select2('open') 方法。”
- google-app-engine - 如何将 www.site.appspot.com 重定向到非 www?