小弟原来发个求助 关于降低cpu占用率的问题 可是现在小弟用sleep和
procedure sleepx(ms:Integer);
var
staretime:TDateTime;
begin
staretime:=Now();
while MilliSecondsBetween(staretime,Now())<ms do
begin
Sleep(1);
Application.ProcessMessages();
end;
end;
这个方法都造成了程序的假死 我有三个线程同时运行 结果有两个运行sleepx函数 第三个线程都没启动就死了...
sleepx(1000);
a:=aa.create(false);
这样就崩了
请问 这个应该怎么改?谢谢!
procedure sleepx(ms:Integer);
var
staretime:TDateTime;
begin
staretime:=Now();
while MilliSecondsBetween(staretime,Now())<ms do
begin
Sleep(1);
Application.ProcessMessages();
end;
end;
这个方法都造成了程序的假死 我有三个线程同时运行 结果有两个运行sleepx函数 第三个线程都没启动就死了...
sleepx(1000);
a:=aa.create(false);
这样就崩了
请问 这个应该怎么改?谢谢!
直接sleep就行了,子线程中不要处理消息。
贴代码吧
begin
while not Terminated do
begin
Synchronize(AA);
sleepx(1000);
end;
end;
procedure A.AA
BEGIN
fun(@KK,@id,True);
sleepx(3000);
fun(@GG,@ID,False);
sleepx(1000);
BB();
sleepx(1000);
fun(@LL,@ID,False);
sleepx(1000);
END
这个是线程之一 另外两个也是类似的 程序老假死....
procedure sleepx(ms:Integer);
var
staretime:TDateTime;
begin
staretime:=Now();
while MilliSecondsBetween(staretime,Now()) <ms do
begin
Sleep(0);
Application.ProcessMessages();
end;
end;
这句会同步到主线执行,阻塞主线运行,一般需要操作VCL才会使用 Synchronize
这句加上了就意味着AA是到主线程中执行的,你AA中sleep就是把主线程阻塞了,当然会假死