Delphi 在OTL异步/等待线程中使用局部变量安全吗?
我很抱歉问这么简单的问题。这是我第一次在VCL中使用背景线程。所以我想知道在异步部分使用局部变量是否安全Delphi 在OTL异步/等待线程中使用局部变量安全吗?,delphi,omnithreadlibrary,Delphi,Omnithreadlibrary,我很抱歉问这么简单的问题。这是我第一次在VCL中使用背景线程。所以我想知道在异步部分使用局部变量是否安全 procedure Tfrm1.ThreadedFillDataset; var ds : TOracleDataSet; begin lblThread.Caption := 'Thread start'; Async( procedure begin // executed in background thread //Sleep(3
procedure Tfrm1.ThreadedFillDataset;
var
ds : TOracleDataSet;
begin
lblThread.Caption := 'Thread start';
Async(
procedure
begin
// executed in background thread
//Sleep(3000);
ds := TOracleDataSet.Create(Self);
//SetVariables
ds.Open;
end)
.Await(
procedure
begin
ds.First;
while not ds.Eof do
begin
//Fill design time dataset on form
ds.Next;
end;
ds.Free;
lblThread.Caption := 'Thread finished';
end);
end;
假设我执行这个方法三次,第一个线程没有完成。这会导致问题吗
你能建议另一种解决这个问题的方法吗?(使用后台线程查询数据库,将结果追加到VCL数据集中。)
谢谢
编辑:我已经检查了问题的答案,我的问题被标记为重复的。我得出的结论是,如果我的方法被调用3次,那么所有3个
ds
局部变量都将指向不同的内存地址,因此每个线程都将访问其TOracleDataSet的本地副本,并且不会出现任何问题。如果有人能证实这一点,我可以结束这个问题,谢谢。为什么不在后台线程中填充TOracleDataSet?因为等待部分是在主线程中执行的,所以vcl追加的顺序是否重要?如果没有,我看不到任何问题。如果TOracleDataSet对象属于表单,那么如果同时从后台线程和VCL线程访问它,会不会导致问题?TOracleDataSet对象是以表单作为所有者创建的。我想你不需要主人。您可以在wait方法中控制此对象的生存时间。从线程安全的角度来看,多次调用ThreadedFillDataSet方法是可以的。在我看来,不应该这样做。异步/等待匿名过程的执行超出了ThreadedFillDataset
的范围(我猜)。所以使用局部变量在概念上是错误的。@SotircaMihaitaGeorge我只是四处看看,读了一篇文章,其中提到匿名方法捕获局部变量。这是在编译器级别完成的。因为这里我们使用了一个匿名函数,编译器为我们完成了所有的工作。它“捕获”锁变量并允许匿名函数使用它。为什么不在后台线程中填充TOracleDataSet?因为等待部分是在主线程中执行的,所以vcl追加的顺序是否重要?如果没有,我看不到任何问题。如果TOracleDataSet对象属于表单,那么如果同时从后台线程和VCL线程访问它,会不会导致问题?TOracleDataSet对象是以表单作为所有者创建的。我想你不需要主人。您可以在wait方法中控制此对象的生存时间。从线程安全的角度来看,多次调用ThreadedFillDataSet方法是可以的。在我看来,不应该这样做。异步/等待匿名过程的执行超出了ThreadedFillDataset
的范围(我猜)。所以使用局部变量在概念上是错误的。@SotircaMihaitaGeorge我只是四处看看,读了一篇文章,其中提到匿名方法捕获局部变量。这是在编译器级别完成的。因为这里我们使用了一个匿名函数,编译器为我们完成了所有的工作。它“捕获”锁变量并允许匿名函数使用它。