【发布时间】:2014-01-18 18:31:10
【问题描述】:
谁能告诉我如何在 Delphi 2010 中创建一个线程,该线程将“待机”以供计算数据(在其计算任务后不终止)?
我创建了一个程序,它通过 Indy UDPServer 从外部源获取数据。 IdUDPServer1UDPRead 事件收集数据并调用不同的线程(取决于数据的类型),但是在调试程序时,我看到线程在计算后被终止,然后再次被创建(线程的创建需要一些时间)。 只要传入数据的频率大于 CPU(或线程)可以处理的频率(在线程完成计算之前有数据到来),我是否可以创建同一线程的 fork 线程。
这是我正在尝试编写的代码:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TBytes;
ABinding:TIdSocketHandle);
begin
form1.panel2.color:=clLime;
ParseDelimited(IdUDPServer1.ReceiveString,'&');
if (Parsedelimited=1) and (Jvthread1.Terminated=true) then
Jvthread1.Execute(self)
else if (Parsedelimited=2) and (Jvthread2.Terminated=true) then
Jvthread2.Execute(self);
Application.ProcessMessages;
// i know this command is not very good but by removing this line the
//gui is responding //after 2 or 3 sec
end;
问题是 JVThread1 或 JVThread2 进行计算所需的时间大于传入的数据,我认为这个问题是由一次又一次创建线程所需的时间引起的(也许这是错误的推测)。尽管如此,通过将传入的 UDP 数据缓冲到 Indy UDPServer 可以部分解决这个问题,但是当我尝试关闭 UDPServer 时,直到它的缓冲区完全为空之前什么都没有发生,这大约需要 3-4 秒。
【问题讨论】:
-
欢迎来到 Stack Overflow。虽然您已努力在问题中包含详细信息,但如果您还可以包含代码会很好。以下是编写好问题的指南。 stackoverflow.com/questions/how-to-ask
-
当我输入我的答案时,我注意到您添加了另一个答案,这确实是一个问题。 (注意如果您的问题有更多信息,请编辑您的问题。如果是不同的问题。请提出一个全新的问题。)至于您的问题:“线程安全”是一个非常具体的问题主题和
Sleep完全不相关。然而Sleep虽然不是很糟糕,但通常被认为是一种笨拙的解决方法,因为您要停止一个进程一段固定的时间。如果需要,您宁愿能够被触发唤醒。我的答案列出了Sleep的更好替代方案。 -
@TwentyGotoTen 我个人对此类更高级别的问题没有意见。 OP 不确定有哪些可用选项,需要一般指导。实际计算的代码仅用于确认已经明确的内容:计算完成后方法结束。
标签: multithreading delphi udp delphi-2010 indy