gpt4 book ai didi

multithreading - Delphi队列和同步参数

转载 作者:行者123 更新时间:2023-12-03 18:18:04 25 4
gpt4 key购买 nike

我已经发布了 question这让我对多线程感到困惑,我还没有在网上找到答案。假设我创建了类似 TTest = class(TThread) 的东西,所以您可以想象我有一个 Execute。在里面我可以调用:

Synchronize(procedure
begin
//code
end);


Queue(procedure
begin
//code
end);

据我所知,上面的代码在匿名方法之前应该有另一个隐藏参数,Self。假设现在我不在派生类(如 TTest)中,而是在按钮单击事件中。我可以这样称呼:

TTask.Run(
procedure
begin

TThread.Queue(nil,
procedure
begin
testB.Text := 'Please wait...';
end;

TThread.Queue(nil,
procedure
begin
testB.Text := 'Please wait MORE...';
end;

end);

这里我使用 nil 作为参数,因为(如果我是正确的)如果我调用 TThread.CurrentThread,当一个 Queue 完成时,另一个将由于 RemoveQueuedEvents() 而被删除。

所以我真正的问题是:如何确定何时必须传递 nilTThread.CurrentThread

  • 我了解到,在像上面的 TTest 这样的 TThread 的派生类中,我可以使用匿名方法调用 Queue/Sync 只是因为 Self 来拯救。

  • 例如,如果我必须在 TTask.Run 中调用 Queue 或 Synchronize,我确定我必须使用 nil 参数吗?

我对这类事情很陌生,所以我觉得这很难,我想理解这个概念,否则我会创建损坏的应用程序。我看到 Nick Hodges 在他的书中使用了 nil 和 CurrentThread,但我不明白为什么。

最佳答案

即使在 TThread 后代 Execute 方法中,您也可以使用 SynchronizeQueue 重载 nil 参数在前面。虽然 Synchronize 不受影响,但可以忽略对 Queue 的调用,原因与线程在 Queue 之前完成的其他情况相同被执行。

Synchronize(nil,
procedure
begin
//code
end);


Queue(nil,
procedure
begin
//code
end);

关于multithreading - Delphi队列和同步参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com