| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2753 人关注过本帖
标题:请教DLL定时器的问题
只看楼主 加入收藏
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
结帖率:94.74%
收藏
已结贴  问题点数:100 回复次数:19 
请教DLL定时器的问题
现在想练习DLL,先定义一个过程,用过程读文件,再定义一个函数利用读出的数据计算输出到调用程序,,但读过程需要一个事件触发,并且定时触发,想用TIMER,可无法加入这一控件,搜索网上、教程,讲了两种方法,一种是通过UNIT引用,另一种是用API函数,都不详细,难以理解。因此在此求助,望能详解。谢谢  谢谢。

library dlltest1;
uses
  SysUtils,
  Classes;
 var
 x,y,z:integer;
{$R *.res}
procedure read(str:string);/////////////这里是读文件过程
begin
 ...........        
end;

procedure   ontimer();//这里想利用timer事件触发,不知怎样添加此触发方法。?
 begin
     read("dddd");//调用读过程
 
     function Add():integer;stdcall;//定义DLL的输出函数(无参)
        begin
        ..........
        result:= z;
        end;

  end;

exports
Add;
 
begin
end.
 
搜索更多相关主题的帖子: DLL 定时器 
2010-07-23 01:14
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:100 
用API的SetTimer就行。
UINT_PTR SetTimer(
  __in  HWND hWnd,
  __in  UINT_PTR nIDEvent,
  __in  UINT uElapse,
  __in  TIMERPROC lpTimerFunc
);
如果你没有窗体,第一个参数设置为空。nIDEvent指的是计时器的标识。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码。

此方法首先写一个如下格式的回调函数
procedure TimerProc(hWn:HWND,nMsg:integer,nTimerid: DWORD,dwTime:DWORD);
然后再用SetTimer函数来建一个定时器,第三个参数就是这个回调函数的地址。


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 09:03
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄,能否按我上面的框架做个格式,
另外,将输出函数定义在事件循环内和定义在循环外然后在循环体内调用有无不同,对调用程序调用DLL的函数有无影响。

谢谢
2010-07-23 10:29
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
以前看到要用HWND,不会用,现在不用窗体设置为空简单多了,可是不知将其放在那个位置,引用那个系统单元。
2010-07-23 10:34
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
简单例子:需要引入windows单元。
程序代码:
var
  Form1: TForm1;
  gTimeID: DWORD;
implementation

{$R *.dfm}
procedure OnTimer(hwn:HWND;msg:Integer;TimerID:DWORD;mTime:DWORD);stdcall;
var
  PlayTxt: AnsiString;
begin
  PlayTxt:= '时间到 _' + '时间ID: '+ IntToStr(TimerID)
     + ' _时间(ms)' + IntToStr(mTime);
  Form1.Memo1.Lines.Add(PlayTxt);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;

  if Button1.Caption = '开启时钟' then
  begin
    gTimeID:= SetTimer(0,1,500,@OnTimer);
    Button1.Caption:= '关闭时钟';
  end
  else
  begin
    KillTimer(0,gTimeID);
    Button1.Caption:= '开启时钟';
  end
end;

end.
Project1.rar (158.66 KB)



[ 本帖最后由 东海一鱼 于 2010-7-23 10:42 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 10:40
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
鱼兄在线呀,很快。
我现在是在DLL中使用,没有button/memeo等控件的,因此不懂创建和消除定时器的制作,请明示
2010-07-23 10:45
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
直接在你需要调用设置时钟的地方调用SetTimer就行了。SetTime的第4个参数为回调函数OnTimer的地址。
在OnTimer里响应定时,处理你的逻辑。记住这个函数必须是stdcall调用方式,不然程序会崩溃。
在程序退出或你不需要时,用KillTimer释放时钟。

不需要任何控件。上面的button/memeo我只是为了演示。



[ 本帖最后由 东海一鱼 于 2010-7-23 11:01 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 10:59
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
基础差,还是不明白怎样做,回调函数的地址就把我搞晕了。

[ 本帖最后由 yalewang 于 2010-7-23 11:09 编辑 ]
2010-07-23 11:04
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
你按你的想法写一个,回头我看看。互相学习一下。
不然,我也不知道你的问题在哪里?

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 11:17
yalewang
Rank: 2
等 级:论坛游民
帖 子:125
专家分:35
注 册:2010-4-15
收藏
得分:0 
好的谢谢
2010-07-23 11:19
快速回复:请教DLL定时器的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032880 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved