如何在执行任务同时显示动画?急!急!急!(100分)

  • 主题发起人 主题发起人 kasa
  • 开始时间 开始时间
K

kasa

Unregistered / Unconfirmed
GUEST, unregistred user!
在执行一个OLE类对象时很耗时间,就象死机了一样,为了显示出正在运行,
想在窗体上加个小动画,能表现出程序正在执行就可以了,但我使用timer
没能实现。因为timer的消息级别太低,被忽略了。各位有好的实现方法请
告诉我(最好有例子)
我的E-MAIL:tianjunji@163.net.
多谢!!!!!!!!!!!!
 
我正在学线程,要不要发给你一个Charlie他老人家的例子?
 
把执行OLE对象的代码放进一个线程当中试试
 
加上Application.ProcessMessages
 
用多线程
 
用Application.ProcessMessages 可以让应用程序立即处理消息队列里的消息!
 
用多线程,其中一个显示动画在动,不用Timer,用Delphi自带的TAnimate
控件显示一个.Avi文件,网上有很多漂亮的.gif动画,你可以用
Gif Movie Gear这个软件将.gif转成.avi,如愿意还可对原作改上几笔,
效果非常好!
Gif Movie Gear软件在这:
湖南信息港软件库 http://chat.hn.cninfo.net/soft/
 
TAnimate据说已经用了多线程
 
可以试试RXLIB中的GIF控件。
 
多线程 + TAnimate是最佳方法!
 
用多线程来实现是最好不过的了
 
没什么好说的,就是多线程的问题,不过我正在学
 
这是从网上copy的,但是,应该是Charles Calvert的原例子:

----Windows95是Microsoft公司的第一个真正的多任务操作系统。在每一时刻可以
有多个进程同时工作,而每一个进程又包含有多个线程。但只有一个处理器的计算机
不可能真正地“同时”执行多个线程,而是操作系统把时间分成若干个时间片,然后
把一个个时间片分配给每一个线程。

----一个执行了的程序就是一个进程,一个进程则至少有一个主线程。一位高级程序
员,绝不会让自己的程序里面只有一个主线程存在(除非只有很少的几十行代码),
而是尽量让自己的程序在同一时刻里干更多的事,在比较大一点的应用中尤其如此,
象数据库应用程序,在统计的时候我还想做其他事呢!因此,如何有效地利用线程则
是每一个程序员都应了解的。本文就此简单地谈一下在Delphi中如何利用线程。

----(一)当使用线程时,我们主要有两个任务:
----(1)创建一个线程。
----(2)创建一个能作为线程入口的函数。
----WindowsAPI调用CreateThread函数来创建一个线程。函数如下:

HANDLE CreateThread(LPSECURITY_
ATTRIBUTESlpThreadAttributes,
//线程安全属性地址
DWORDdwStackSize,
//初始化线程堆栈尺寸
LPTHREAD_START_ROUTINElpStartAddress,
//线程函数所指向的地址
LPVOIDlpParameter,
//给线程函数传递的参数
DWORDdwCreationFlags,
//有关线程的标志
LPDWORDlpThreadId
//系统分配给线程的ID
);
----第一个参数是安全属性,一般设为nil,使用缺省的安全属性。当我们想此线程
有另外的子进程时,可改变它的属性。
----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线
程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
----第三个参数,也是最重要的一个,是一个指向函数名的指针,但传递时很简单,
只需在线程函数名前加上@就可以了。
----第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需
传递参数时,则这个参数设为nil。
----第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一
个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配
给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用
SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被
立即调用。一般传为0即可。
----最后一个参数是系统分配给这个线程的唯一的ID标志。
----下面这个程序MyThreadPro.pas介绍了线程如何建立及使用:

//Your first test Thread Program.
unit MyThreadPro;
interface
uses
Windows,Messages,SysUtils,Classes,
Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TForm1=class(TForm)
UsedThread:TButton;
NoUsedThread:TButton;
procedure UsedThreadClick(Sender:TObject);
procedure NoUsedThreadClick(Sender:TObject);
var
Form1:TForm1;
implementation
{$R*.DFM}
//这是线程函数,
它可以放在下面程序的任何地方
function MyThreadFunc(P:pointer):Longint;stdcall;
var
i:integer;
DC:HDC;
S:string;
begin
DC:=GetDC(Form1.Handle);
for i:=0 to 100000 do begin
S:=Inttostr(i);
Textout(DC,10,10,Pchar(S),length(S));
end;
ReleaseDC(Form1.Handle,DC);
end;
procedure TForm1.UsedThreadClick(Sender:TObject);
var
hThread:Thandle;//定义一个句柄
ThreadID:DWord;
begin
//创建线程,同时线程函数被调用
hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
ifhThread=0then
messagebox(Handle,'Didn’tCreateaThread',nil,MB_OK);
end;
procedure TForm1.NoUsedThreadClick(Sender:TObject);
begin
MyThreadfunc(nil);
//没有创建线程时,直接调用线程函数
end;
end.
----上面这个程序介绍了我们在使用线程及未使用线程二种情况下,运行该程序的反
应。当点UsedThread按钮时,则建立一个线程,这时我们可以在程序进行计算的同
时,改变窗体的尺寸及移动它。当按下NoUsedThread按钮时,不建立线程,我们会发
现在程序没有计算完之前根本不能做其它任何事情!

注:Charles Calvert,曾和负责Delphi的开发,测试,文档的部门密切合作.
他的例子很具有权威性
 
多谢各位的热心帮助,该问题本人通过时间中断和回调函数实现了。
 
时间中断和回调函数?讲出来大家都学学!谢谢了!
 
用API函数设置时间中断;
timebeginperiod(2000);
m:=timesetevent(2000,2000,@catchmmtimer,fm_myform.Handle,TIME_PERIODIC);
fm_myform是窗体的 name. catchmmtimer是回调函数名。m:integer;
结束时间中断调用 timekillevent(m);
在回调函数中实现动画,但要尽量短、快。
回调函数定义形式如下,是从*o*(先生/小姐)那学来得。
function catchmmtimer(IDevent:integer;URD:integer;dwuser:longint;drd1:longint;drd2:longint):integer;stdcall;
 
hehe,以前见过
 
接受答案了.
 
后退
顶部