我有一个 form里面有多个 Image,假设20个吧如果我用 Timer 定时
for 来逐个 LoadfromStream() 更新图片(大小都一样),从而产生动画效果.问题是:逐个更新好象是,执行N次,Image的 绘制,显示,下一个.......
这样运行结果每个Image的图片限制时间,会有细微差异.
我想了个办法不知道是否可行,如果可行该怎么做.
我的办法是, 锁定窗口更新
for 逐个Loadfromstream()
解锁窗口///////////////////////
不知道如何锁定
for 来逐个 LoadfromStream() 更新图片(大小都一样),从而产生动画效果.问题是:逐个更新好象是,执行N次,Image的 绘制,显示,下一个.......
这样运行结果每个Image的图片限制时间,会有细微差异.
我想了个办法不知道是否可行,如果可行该怎么做.
我的办法是, 锁定窗口更新
for 逐个Loadfromstream()
解锁窗口///////////////////////
不知道如何锁定
我是自己把一堆TImage一次性建立,放进 TList保管,用到的时候用 for逐个更新图片
1)程序
2)图片目录
a10000010.jpg
a10000011.jpg
a10000012.jpg
a10000013.jpg
a10000014.jpg
a10000015.jpg
在程序中用控件Timer,随机生成"文件名",并读取相关的"图片文件"
for 来对每个Image刷新图片按系统的理解,他肯定是 逐个 Image的读取图片->显示,然后下一个Image.........我希望是只读取图片,或者在内存中作画(反正不是直接显示在屏幕上)
等所有的Image更新完毕后,一次全部显示出来
就像,
锁定form的画布
逐个image作画
解锁画布-->显示
下面是几个例子
procedure procedure1
begin
(你的绘图方法)
end; Synchronize(procedure1); 临界区例子
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SyncObjs;
var
CS: TCriticalSection;
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
i: Integer;
begin
CS.Enter;
for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));
CS.Leave;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Align := alLeft;
CS := TCriticalSection.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CS.Free;
end;
end.
不用每个Image更新图片,显示,下一个image更新图片,又显示....每次每个Image画到窗口上的时候,都是有时差的,因为是逐个画上去的.我希望锁定,不画,一次画好,然后显示
锁定form的画布 //不知道用什么代码 就是这里!!!目的不让下面的Image.load之后就显示到屏幕上
//因为直接显示的话,会有时间差的
image1.loadfromfile('x.jpg');
image2.loadfromfile('x.jpg');
.....
....
....
解锁画布-->显示 //
直接用VCL做而已如果用DX写的话,主要是一大堆类啥的要建,麻烦
而且我实现的功能比较简单,没必要用大炮打蚊子
图片随机显示实例DEMO
不过,你的给我两分呀
http://download.csdn.net/source/3401795
先把所有的图片读入内存后,再刷到image。有一定的作用,但不能彻底解决问题。
Image1.loadfromstream();
Image2.loadfromstream();
..
..
每个Image.load后直接显示到屏幕上,
我希望只Load先不显示到屏幕上,等所有的都Load后同时显示
麻烦点。
可能还要缩放,还要根据点的位置来判断点了哪个图~~~麻烦,有没有简单点的
这样麻烦一些,是不是能快点。
http://baike.baidu.com/view/1988590.htm
对了,虽然上面的是0,但是还是有时差的,2个方式的 CPU占用都很猛!!25%,我的机器是 I5 750的!天啊,谁能再给我点思路啊,难道真的要我去用 DX画才能速度快点?