Ran*_* B. 5 delphi multithreading pascal
我有一个程序,它使用一个执行一些工作的线程.线程应通知进度的另一个线程(在本例中为主线程).
如果我使用Synchronize()来执行同步,一切都按预期工作.如果我与主线程同步并发布for-variable并将其放入列表中,则每个值都可以正确打印到我的ListBox中:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Synchronize(
procedure()
begin
FireEvent(i);
end);
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出:1,2,3,4,5 ...... 1000
如果我使用Queue()执行同步,则输出不符合预期:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Queue(
procedure()
begin
FireEvent(i);
end);
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出:200,339,562,934,1001,1001,1001,1001,1001,1001,1001,1001,1001,[...]
这里发生了什么事?据我所知,匿名程序应该捕获变量"i"?
匿名过程捕获变量引用.这意味着在匿名过程运行时该值未确定.
为了捕获一个值,你必须将它包装成一个独特的框架,如下所示:
Type
TWorkerThread = class (TThread)
...
function GetEventProc(ix : Integer): TThreadProcedure;
end;
function TWorkerThread.GetEventProc(ix : Integer) : TThreadProcedure;
// Each time this function is called, a new frame capturing ix
// (and its current value) will be produced.
begin
Result := procedure begin FireEvent(ix); end;
end;
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Queue( GetEventProc(i));
end;
end;
Run Code Online (Sandbox Code Playgroud)
另请参见匿名方法 - 变量捕获与值捕获.
归档时间: |
|
查看次数: |
286 次 |
最近记录: |