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:))