本窗口Hide后,如何控制刷新背景上的此部分? ( 积分: 200 )

要讲到用优先级了...
这是不是太过了呢?
在所有的win32平台优先级都可调嘛?

“系统发的wm_piant肯定是有效的,但是如果你这个程序立即去抓,可能他还没有绘制呢。你这样,hide后先降低你的程序的优先级,然后sleep(0),即让出一个时间片,然后再提升自己的优先级到正常状态,这样大约会让出30ms的时间给其他进城,看它是不是一般都已经绘好了。 ”
完全看不出这样和Application.ProcessMessage有什么两样,Application.ProcessMessage似乎让的还彻底一点
先找找看优先级的修改方法

感觉还是应该用SendMessage重绘的方法
或是更好地用直接类似InvalidateRgn的函数实现
Windows系统本身肯定是用某种函数直接实现的,要想办法找到啊
 
先找找看优先级的修改方法
--------------------------------------------------------
sleep(0)就让出一片时间了,也就是在队列里调整了一次优先级
 
调整了又怎么样了
问题是这个想法和ProcessMessage或者说是Yield根本就是一个性质
 
但是我这里发wm_null是可行的,
虽然测试时任务栏仍会出现,但那是因为我在狂点任务栏来切换,一般应该不会达到这个地步
 
SetPriorityClass(Application.Handle,IDLE_PRIORITY_CLASS);
Sleep(0);
SetPriorityClass(Application.Handle,NORMAL_PRIORITY_CLASS);
写上了,效果是80%出现画完到一半的背景窗口,20%出现正确的样子,还是不行
和单独
Sleep(0);
的效果完全一样,Sleep估计有下限值,一个时间片之类的
 
WM_NULL除了对于任务栏之外,的确是可行的
 
下面这段代码就能够测试出Sleep(0)是起作用的,只是看系统调度了,那就有一定的随机性了。其中QueryPerformanceCounter(counterBefore);和QueryPerformanceCounter(counterAfter);这两条指令的执行所耗费的counter是4(在我的机器上),下面代码中减去了这个误差[:)]

procedure TForm1.Button1Click(Sender: TObject);
var
timeBefore,timeAfter:Integer;
counterBefore,counterAfter:Int64;
begin
timeBefore :=GetTickCount;
QueryPerformanceCounter(counterBefore);

Sleep(StrToIntDef(ledtSleepTime.Text,0));

QueryPerformanceCounter(counterAfter);
Caption :=IntToStr(counterAfter -counterBefore -4);

timeAfter :=GetTickCount;
ledtSleepTime.Text :=IntToStr(timeAfter -timeBefore);
end;
 
Sleep(0)是有点作用的,但是作用还是完全不够,Sleep(0)肯定不是用掉0,而是一个下限值
效果是80%出现画完到一半的背景窗口,20%出现正确的样子,还是不行
 
对于任务栏,可以程序运行的时候,就不让它显示在任务栏上。
好像用SetWindowLong可以,我有点忘了,你可以查一查,不好意思。
 
真是个看起来简单做起来难的问题
值得继续探讨
同时我觉得楼主也不妨先将就着sleep个100ms毕竟现在的计算机运算速度基本上都上G了
而且速度还在提高中
我的电脑cpu c500 sleep(100)后 不会出现问题
我想现在比我的电脑慢的也不多了
但这个问题还要继续探讨
 

Similar threads

回复
0
查看
524
不得闲
S
回复
0
查看
707
SUNSTONE的Delphi笔记
S
S
回复
0
查看
628
SUNSTONE的Delphi笔记
S
顶部