【问题标题】:CreateAnonymousThread with parameters带参数的 CreateAnonymousThread
【发布时间】:2016-01-20 01:55:33
【问题描述】:

在 C# 中,我们有 ParameterizedThreadStart,它允许我们创建一个向其传递参数的线程,如下所示:

Thread thread = new Thread (new ParameterizedThreadStart(fetchURL));
thread.Start(url);

// ...
static void fetchURL(object url)
{
    // ...
}

我尝试使用CreateAnonymousThread 在 Delphi 上重现,但它似乎不接受参数。

如何创建匿名线程并将参数传递给被调用的过程?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    TThread.CreateAnonymousThread 将anonymous method 作为参数,因此您可以组合一个方法来传递您想要的任何值。这些值被捕获,因此您在传递参数时需要小心。阅读上面匿名方法链接中的“变量绑定机制”部分,了解有关变量捕获的更多信息。

    例如:

    procedure DoSomething(const aWebAddress: String);
    begin
    end;
    
    procedure BuildThread;
    var
      myThread: TThread;
      fetchURL: string;
    begin
      fetchURL := 'http://stackoverflow.com';
      // Create an anonymous thread that calls a method and passes in
      // the fetchURL to that method.
      myThread := TThread.CreateAnonymousThread(
        procedure
        begin
          DoSomething(fetchURL);
        end);
      ...
    end;
    

    【讨论】:

    • 我可以建议创建一个局部变量并将1分配给局部变量而不是一个常量,所以它实际上是一个参数。现在不是,它只是编译成代码。就像DoSomething - 它是过程的常量地址,而不是变量,因此没有“通过”。 1 也一样,它现在不是参数。
    • @Arioch'我可以做到。该示例是我可以放在一起的最简单的示例,它演示了 OP 的要求,即将参数传递给方法。我可以很容易地组合一个编译器来创建一个内部变量并传递它。我对 OP 要求的理解是他/她希望能够将某些内容传递到匿名线程中。它可以是常量或变量。
    • pass something into the anonymous thread - 是的,但你只能pas 一些不属于那里的东西,对吧?当您在程序 1 中有一个变量时,您可以 pass 将其传递给程序 2。但是如果您在程序 2 中有一个变量,则程序 1 不能将其传递给程序 2 - t 已经存在!您的初始代码已经声明了常量 - 因此属于 - 匿名过程。现在使用声明的字符串 var - 因此属于 - 您真正捕获并传递它的外部过程。
    • @Graymatter 这是完全线程安全的吗!?我的意思是如果我调用这 4 次它会产生 4 个新线程!?
    • @peimanF。这是正确的。线程之间没有交互。如果您的线程正在共享对象,那就另当别论了,您需要处理它。
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多