DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lixuan123
今日帖子: 0
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 andy_qin (andy_qin) ★☆☆☆☆ -
盒子活跃会员
2003/10/22 9:13:22
标题:
要最简单多线程源码! 浏览:1550
加入我的收藏
楼主: 在查询数据时,因为数据大,要很长时间,让界面不变白即可。 

----------------------------------------------
我是一只小笨鸟,如何能飞高?
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/10/22 10:48:35
1楼: 数据库的暂时没有啊

我找到一个资料:(可能对你有帮助,一起学习啊)
按此在新窗口浏览图片

 Windows 的定时器是一种输入设备,它周期性地在指定的间隔时间通知应用程序。它可以用向指定窗口发送 WM_TIMER 消息或者调用指定的过程来执行用户的程序。定时器的应用主要包括下面一些地方: 
时钟程序 - 显然,这是定时器最直接的应用。 
多任务 - 如果程序有大量的数据处理,除了用多线程的办法,还可以用定时器,在每一个定时器消息中处理一小块内容。 
定时显示程序的状况 - 定时器就相当于 Dos 编程中的自己挂接在 int 1ch 上面的要定时处理的程序,它可以定时显示程序运行的情况,如发送了多少内容,接收了多到内容等等。 
在游戏程序中使用定时器可以消除在不同处理器下用延时来保持速度一致所造成的误差。 
用于数据流处理 - 在音频、视频的播放中,需要隔一段时间处理一段数据。 
总的来说,在 Dos 下实现精确定时的唯一方法是在 int 1ch 时钟中断中处理程序,但你使用起来必须遵守很多的规范,而在 Windows 的定时器中,你可以用 SetTimer 函数分配不止一个的定时器,比如说,在你的文本编辑程序中,你可以使用一个间隔1秒的定时器来在状态栏中显示时钟,同时分配一个10分钟的定时器来实现定时存盘的功能。定时器实际上是 Windows 对时钟中断的一种扩展,它的本质还是基于时钟中断的,所以你实际上无法把定时器的间隔设置到55毫秒以下,另外,定时器的精度也是以55毫秒为倍数的,比如说,你设置了一个1秒的定时器,它实际上是在每989毫秒的时候发生的。和在 Dos 下使用时钟中断,windows 的定时器还有下面一些要点: 

在 Dos 中,你的程序随时可能被 int 1ch 打断,而在Windows 中,Windows 通过 WM_TIMER 消息把定时器消息放入正常的消息队列中,所以你不必担心你的程序在别的处理中被定时器打断。 
不可能有同时两条以上的 WM_TIMER 消息,如果在一个还在消息队列中,窗口再得到一条 WM_TIMER 消息,两条消息会被合并为一条,所以在程序比较忙的时候可能会丢失 WM_TIMER 消息。 
WM_TIMER 消息的级别是很低的,程序只有在消息队列中没有其他消息的情况下,才会接收 WM_TIMER 消息,你可以通过下马方法验证:在一个设置了定时器的窗口上按住标题栏移动窗口,你会发现定时器停止了工作,当你松开鼠标后,在这个过程中丢失的 WM_TIMER 消息并没有被补上,所以如果你设计一个时钟程序,你不能使用定时器消息来计数,而必须在消息中每次获取正确的系统时间。 
讲了这么多定时器的特点,下面是定时器相关的API,你会发现除了在使用中要注意的这些特性,定时器的API真是又少又简单: 

建立定时器
SetTimer( 
HWND hWnd, // handle of window for timer messages 
UINT nIDEvent, // timer identifier 
UINT uElapse, // time-out value 
TIMERPROC lpTimerFunc // address of timer procedure 
);
hWnd 是 windows 发送 WM_TIMER 的窗口,nIDEvent 是定时器的编号,在 WM_TIMER 中出现在 wParam 参数中,用来区分在多个定时器的情况下,这条消息是由哪个定时器产生的。uElapse 是定时器间隔的毫秒数,如果你要设置一个1秒的定时器,这个值就是1000,lpTimerFunc 是处理定时器消息的过程,如果这个参数不是 NULL,windows 在到时间后会调用lpTimerFunc 指定的过程,调用的参数是 CALLBACK TimerProc(hwnd,WM_TIMER,iTimerID,dwTime),iTimerID 是定时器 ID,dwTime 是系统时间;如果 lpTimerFunc 参数是 NULL,Windows 会把 WM_TIMER 消息放入消息循环中,消息的 hWnd 是第一个参数中指定的 hWnd,也就是说向这个窗口发送了 WM_TIMER 消息。
另外,如果你的程序没有窗口,你也可以用这种办法建立定时器:invoke SetTimer,NULL,NULL,uElapse,TimerProc,函数会返回一个系统定义的 TimerID供你在 KillTimer 中使用。 

取消定时器
KillTimer( 
HWND hWnd, // handle of window that installed timer 
UINT uIDEvent // timer identifier 
);
取消定时器只需对应 SetTimer 时的 hWnd 和 uIDEvent 调用 KillTimer 函数就行了。 
在本节的例子程序中,我在对话框中的 WM_INIT 消息中用 SetTimer 建立两个定时器,时间分别是500ms 和 200ms,然后在间隔0.5秒的定时器消息中更换按钮上的图片,在间隔 0.2 秒的定时器消息中更换标题栏上的小图标,你就可以看到动画的效果了。 

源程序 - 汇编源文件 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Programmed by 罗云彬, bigluo@telekbird.com.cn
;Website: http://asm.yeah.net
;LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;版本信息
;汇编教程附带例子程序 - 定时器的使用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

.386
.model flat, stdcall
option casemap :none   ; case sensitive 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

includewindows.inc
includeuser32.inc
includekernel32.inc
includecomctl32.inc
includecomdlg32.inc 

includelibuser32.lib
includelibkernel32.lib
includelibcomctl32.lib
includelibcomdlg32.lib 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

IDI_MAINequ1
IDI_MOON1equ2
IDI_MOON2equ3
IDI_MOON3equ4
IDI_MOON4equ5
IDI_MOON5equ6
IDI_MOON6equ7
IDI_MOON7equ8
IDI_MOON8equ9 

DLG_MAINequ1000
ID_MOONequ1001 

ID_TIMER1equ1
ID_TIMER2equ2
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

.data? 

hInstancedd?
dwCounter1dd?
dwCounter2dd?
hIcon1dd?
hIcon2dd?
hIcon3dd?
hIcon4dd?
hIcon5dd?
hIcon6dd?
hIcon7dd?
hIcon8dd?
szBufferdb256 dup(?) 

.data 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

.code
;********************************************************************
_ProcDlgMainprocuses ebx edi esi, hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD 

moveax,wMsg
;********************************************************************
.ifeax ==WM_CLOSE
invokeKillTimer,hWnd,ID_TIMER1
invokeKillTimer,hWnd,ID_TIMER2
invokeEndDialog,hWnd,NULL
;********************************************************************
.elseifeax ==WM_INITDIALOG
movedi,offset hIcon1
movebx,IDI_MOON1
movecx,8
@@:
pushecx
invokeLoadIcon,hInstance,ebx
cld
stosd
incebx
popecx
loop@B
invokeSetTimer,hWnd,ID_TIMER1,500,NULL
invokeSetTimer,hWnd,ID_TIMER2,200,NULL
invokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,hIcon1
;********************************************************************
.elseifeax ==WM_TIMER
.ifwParam == ID_TIMER1
incdwCounter1
.ifdwCounter1 == 8
movdwCounter1,0
.endif
moveax,dwCounter1
shleax,2
addeax,offset hIcon1
moveax,[eax]
invokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
.else
incdwCounter2
.ifdwCounter2 == 8
movdwCounter2,0
.endif
moveax,dwCounter2
shleax,2
addeax,offset hIcon1
moveax,[eax]
invokeSendDlgItemMessage,hWnd,ID_MOON,BM_SETIMAGE,IMAGE_ICON,eax
.endif
;********************************************************************
.else
moveax,FALSE
ret
.endif   
moveax,TRUE
ret 

_ProcDlgMainendp
;********************************************************************
start:
invokeGetModuleHandle,NULL
movhInstance,eax
invokeDialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0
invokeExitProcess,NULL
;********************************************************************
endstart
程序的分析和要点 

   有了上面的介绍,这个程序是很容易看懂的,在 WM_TIMER 消息中,通过 wParam 中的 TimerID 可以区分是哪个定时器产生的消息。在 WM_CLOSE 消息中,通过 KillTimer 来取消定时器。本程序中的的图标定义在资源文件中,在对话框建立的时候,先用 LoadIcon 装入,然后为两个定时器分别保存一个图片编号 dwCounter1 和 dwCounter2,在定时器消息中分别用 WM_SETICON 和 BM_SETIMAGE 消息来对窗口标题的图标和按钮的图标进行设置。 

 
 


----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行80.07813毫秒 RSS