Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Delphi在匿名线程中调用函数?_Multithreading_Delphi - Fatal编程技术网

Multithreading Delphi在匿名线程中调用函数?

Multithreading Delphi在匿名线程中调用函数?,multithreading,delphi,Multithreading,Delphi,我必须在一段时间内调用匿名线程中的函数 我的示例函数如下所示,仅用于打印输出: function processPureTmFrame(rowFrame : string;tmDataGroupRef:string ):string; TThread.Synchronize(nil, procedure begin form2.Memo1.Lines.Add( tmSlitFrame ); end ); end;

我必须在一段时间内调用匿名线程中的函数

我的示例函数如下所示,仅用于打印输出:

function processPureTmFrame(rowFrame : string;tmDataGroupRef:string ):string;
    TThread.Synchronize(nil,
      procedure
      begin
         form2.Memo1.Lines.Add( tmSlitFrame );
      end
    );      
end;
当我这样调用函数时:

代码1

while tmBody.Length>0 do
begin
    tmBodyFrameLength := ((hextodec( copy(tmBody,11,2) )+6)*2)+2;
    tmSplitFrame :=  copy(tmBody , 1 , tmBodyFrameLength );
    delete( tmBody, 1, tmBodyFrameLength );

    myThread := TThread.CreateAnonymousThread(
    procedure
    begin
        processPureTmFrame( tmSplitFrame , tmDataGroupRef );
    end);
    myThread.Start;
end;
在循环的第一个循环中,输出丢失

但是当我调用没有线程的代码时,一切都正常

代码2

while tmBody.Length>0 do
begin
    tmBodyFrameLength := ((hextodec( copy(tmBody,11,2) )+6)*2)+2;
    tmSplitFrame :=  copy(tmBody , 1 , tmBodyFrameLength );
    delete( tmBody, 1, tmBodyFrameLength );
    processPureTmFrame( tmSplitFrame , tmDataGroupRef );
end;
正确的输出必须如下所示

0851C007000C010100000007581850C001F116
0836C0BE001003627169DCA200000000000090D72AACAF
0814C0B6001C03197169DCA31901E2041211131D001F00001F1E1C1F1F1E1E1E0077AA
0814C0B7001E03197169DCA31902FE00540F0000000000000000000000000000000000E238
0814C0B8000B03197169DCA31903FE01384E
0817C0B9000D05017169DCA3E6010190B03F042D
0852C000000B036200000000FAFFFFBF16A3
0852C001000B036200000001F4FF00000000
但是当调用线程(代码1)时,它的

0836C0BE001003627169DCA200000000000090D72AACAF
0814C0B6001C03197169DCA31901E2041211131D001F00001F1E1C1F1F1E1E1E0077AA
0814C0B7001E03197169DCA31902FE00540F0000000000000000000000000000000000E238
0814C0B8000B03197169DCA31903FE01384E
0817C0B9000D05017169DCA3E6010190B03F042D
0852C000000B036200000000FAFFFFBF16A3
0852C001000B036200000001F4FF00000000
没有线程(代码2)输出正常

注意#1:我没有收到任何错误,如:

系统错误。代码:1400。无效的窗口句柄或任何其他内容


注意#2:正如我所说的,只是第一个循环,而不是发送到新线程。其他线路正在发送和处理,一切正常

问题在于匿名方法捕获变量。因为变量被捕获,所以它的值在主循环期间发生变化。实际上,所有线程共享同一个变量。线程与主循环并行运行,并且没有顺序约束。因此,在一个线程有机会使用该值之前,主循环修改捕获的变量是完全可能的

您的代码将使用值捕获(与变量捕获相反)。不直接支持价值捕获,但很容易模拟相同的效果。看


我想说的是,这个线程代码将比串行代码慢。你希望达到什么目标

问题在于匿名方法捕获变量。因为变量被捕获,所以它的值在主循环期间发生变化。实际上,所有线程共享同一个变量。线程与主循环并行运行,并且没有顺序约束。因此,在一个线程有机会使用该值之前,主循环修改捕获的变量是完全可能的

您的代码将使用值捕获(与变量捕获相反)。不直接支持价值捕获,但很容易模拟相同的效果。看



我想说的是,这个线程代码将比串行代码慢。你希望达到什么目标

@david Heffernan我又添加了一些数据,这和你标记的不一样!哥们,在我把它标为傻瓜后,你改变了问题。编辑历史很清楚。我刚刚添加了一些注释!!你一定读得更好,我写的函数是一个示例!我的问题是关于调用函数而不是获取输出!我读得很好。不要浪费这个机会。这不是你真正的代码(有语法错误,无法编译)。请不要发布假代码,因为这使其他人无法看到真正的错误。@david Heffernan我又添加了一些数据,这与您标记的不一样!哥们,在我把它标为傻瓜后,你改变了问题。编辑历史很清楚。我刚刚添加了一些注释!!你一定读得更好,我写的函数是一个示例!我的问题是关于调用函数而不是获取输出!我读得很好。不要浪费这个机会。这不是你真正的代码(有语法错误,无法编译)。请不要发布假代码,因为这使其他人无法看到真正的错误。感谢您的回答。下一部分是解码帧并通过internet将其保存到数据库中。所以,为了避免ui中的延迟,我尝试使用线程…您可能不希望每帧创建一个线程。这可能意味着要提供的线程远远超过可用的线程数。另外,请不要无礼。告诉那些你想利用其知识的人他们无法阅读是很不酷的。你是说在我的匿名线程使用变量main thread之前,改变它!?我必须在线程中有一个局部变量才能复制第一行中的值!?不,那还是太晚了。请花些时间阅读我链接的帖子和其他关于变量与价值捕获的帖子。自从我回答这个问题以来,还没有足够的时间让你们完全理解这个问题。学习这样的概念需要时间。没有捷径。我真的很感谢你的帮助。我还不知道如何解决这个问题,我必须多读一些,但是为了一个捷径,我添加了
sleep(1)在我的while:))谢谢你的回答。下一部分是解码帧并通过internet将其保存到数据库中。所以,为了避免ui中的延迟,我尝试使用线程…您可能不希望每帧创建一个线程。这可能意味着要提供的线程远远超过可用的线程数。另外,请不要无礼。告诉那些你想利用其知识的人他们无法阅读是很不酷的。你是说在我的匿名线程使用变量main thread之前,改变它!?我必须在线程中有一个局部变量才能复制第一行中的值!?不,那还是太晚了。请花些时间阅读我链接的帖子和其他关于变量与价值捕获的帖子。自从我回答这个问题以来,还没有足够的时间让你们完全理解这个问题。学习这样的概念需要时间。没有捷径。我真的很感谢你的帮助。我还不知道如何解决这个问题,我必须多读一些,但是为了一个捷径,我添加了
sleep(1)在我的while:))