请问关于线程等待的有关问题
请教关于线程等待的问题
线程定义
TClientDataThread = class(TThread)
private
Bufferdatastr :string;
public
BufferdatastrList:TStringlist;
clienthost:string;
paused:boolean;
TcpClient_DataThread:TTcpClient;
DT_ADC:TADOConnection;
procedure synchNewData;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
end;
线程的动作
procedure TClientDataThread.Execute;
begin
while not Terminated do
begin
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);
end;
synchNewData;
WaitFor;
end;
TcpClient_DataThread.Free;
if DT_ADC<>nil then
begin
DT_ADC.Connected:=false;
DT_ADC.free;
end;
end;
先谢谢大家啦!!
------解决方案--------------------
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
end;
------解决方案--------------------
这线程明显有问题,在线程执行函数里等待自身,WaitFor不能等待自身,会线程死锁的
你要等待可以用WaitForSingleObject,自己用CreateEvent创建个事件
------解决方案--------------------
application.ProcessMessages
注意:线程里面不能用上句。你看看诸多例子中,都没有这样用的。
------解决方案--------------------
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
end;
你的线程在空转,消耗CPU不知道么??
BufferdatastrList.Count=0
这个如果是大多数时间成立,而且也必须要做操作的话,那么表明的业务很频繁,频繁到要一直占用CPU。
如果你的要求不是1MS就轮巡一次的话,可以SLEEP久点,防止CPU空转。
------解决方案--------------------
uses SyncObjs;
......
var
Fevent:TSimpleEvent;
.....
FEvent:=TSimpleEvent.Create;
.......
if Fevent.WaitFor(300)<>wrTimeout then
.....
Fevent.ResetEvent;
.....
线程定义
TClientDataThread = class(TThread)
private
Bufferdatastr :string;
public
BufferdatastrList:TStringlist;
clienthost:string;
paused:boolean;
TcpClient_DataThread:TTcpClient;
DT_ADC:TADOConnection;
procedure synchNewData;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
end;
线程的动作
procedure TClientDataThread.Execute;
begin
while not Terminated do
begin
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);
end;
synchNewData;
WaitFor;
end;
TcpClient_DataThread.Free;
if DT_ADC<>nil then
begin
DT_ADC.Connected:=false;
DT_ADC.free;
end;
end;
先谢谢大家啦!!
------解决方案--------------------
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
end;
------解决方案--------------------
这线程明显有问题,在线程执行函数里等待自身,WaitFor不能等待自身,会线程死锁的
你要等待可以用WaitForSingleObject,自己用CreateEvent创建个事件
------解决方案--------------------
application.ProcessMessages
注意:线程里面不能用上句。你看看诸多例子中,都没有这样用的。
------解决方案--------------------
while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
end;
你的线程在空转,消耗CPU不知道么??
BufferdatastrList.Count=0
这个如果是大多数时间成立,而且也必须要做操作的话,那么表明的业务很频繁,频繁到要一直占用CPU。
如果你的要求不是1MS就轮巡一次的话,可以SLEEP久点,防止CPU空转。
------解决方案--------------------
uses SyncObjs;
......
var
Fevent:TSimpleEvent;
.....
FEvent:=TSimpleEvent.Create;
.......
if Fevent.WaitFor(300)<>wrTimeout then
.....
Fevent.ResetEvent;
.....