读书人

请问关于线程等待的有关问题

发布时间: 2012-02-08 19:52:21 作者: rapoo

请教关于线程等待的问题
线程定义

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;
.....

读书人网 >.NET

热点推荐