Delphi 无窗体DLL使用定时器

这是CSDN上的一段使用线程无窗体DLL使用定时器的代码,求完善代码,使程序能运行到//addmycode处。小弟才学,不懂线程,还有在这段代码里面怎么设置定时器时间。没... 这是CSDN上的一段使用线程无窗体DLL 使用定时器的代码,求完善代码,使程序能运行到//add my code处 。小弟才学,不懂线程,还有在这段代码里面怎么设置定时器时间。没分了,帮帮忙。
原代码链接:http://bbs.csdn.net/topics/290009194

type

TMyThread = class(TThread)

private

FTimer:TTimer;

procedure TimerProc(Sender: TObject);

protected

procedure Execute;override;

public

constructor Create;override;

procedure KillIt;//结束

end;

implementation

procedure TMyThread.TimerProc(Sender: TObject);

begin
//add my code

end;

procedure TMyThread.KillIt;

begin

PostMessage(Handle,WM_QUIT,0,0);

end;

procedure TMyThread.Execute;

begin

FTimer:=TTimer.Create(nil);

try

try

FTimer.Enabled:=false;//需要用的时候Enabled设置为True即可。

FTimer.OnTimer:=TimerProc;

while GetMessage(MsgRec, 0, 0, 0) do begin

TranslateMessage(MsgRec);

DispatchMessage(MsgRec)

end;

Terminate;

finally

FSocket.Free;

end;

finally

FTimer.Free;

end;

end;
展开
 我来答
至少让我看一眼
2014-01-01 · TA获得超过451个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:241万
展开全部

如果你需要在DLL中使用定时器。其实也不必创建窗口。只需要调用Windows API接口,具体的方法与步骤如下:

  1. 首先声明一个回调函数。以及一个定时器ID的常整数。

  2. 使用API函数SetTimer来启动这个定时器。

  3. 在不需要定时器时,使用API函数KillTimer来停止这个定时器。

实际用法如下,需要引用Windows单元:

//定时器的ID
const
  TimerID1 = 100;
//定时器的回调函数

procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD); stdcall;
begin
  //执行你需要的代码
  if (idEvent = TimerID1 )
      Beep;
end;

//在需要创建Timer的时候使用,其中的1000就是定时器的回调周期为1秒
SetTimer(0,TimerID1,1000,@TimerProc);

//在不需要使用定时器的时候停止定时器
KillTimer(0,TimerID1);

当然,如果你对时间的要求比较准确的话,也可以使用Windows多媒体定时器。精确度可以达到1ms左右。具体的使用方法,你可以搜索Delphi 多媒体定时器。

追问
我不需要回调,如果VB使用我的DLL ,回调会使VB非常不稳定,经常崩溃,我只需要再DLL独立使用一个定时器,使用Socket去定时发送一个数据。
追答

我看了一下你的代码,主要是在线程中利用消息循环和TTimer来实现定时器。但是,你需要引用ExtCtrls。而这个单元可能间接地引用了Forms单元。这可能才是你程序不稳定的原因。至于你说使用回调函数会让VB不稳定,其实TTimer也使用到了回调函数。

如果你要坚持用你原来的方法来使用定时器的话,我可以给你例子(需要引用Classes单元):

  TMyThread = class(TThread)
  private
    FTimer: HWND;
    procedure TimerProc(var Message: TMessage);
  protected
    procedure Execute; override;
  public
    procedure KillIt; // 结束
  end;
  
  procedure TMyThread.TimerProc(var Message: TMessage);
begin
  // add my code
  if Message.Msg = WM_TIMER then
  begin
    //执行你需要的代码
    Beep;
  end;
end;

procedure TMyThread.KillIt;
begin
  PostThreadMessage(ThreadID, WM_QUIT, 0, 0);
end;

procedure TMyThread.Execute;
var
  Msg: TMsg;
begin
  try
    //创建一个新的窗口
    FTimer := AllocateHWnd(TimerProc);
    //设置定时器,1000代表定时器的时间为1秒
    SetTimer(FTimer,0,1000,nil);
    //原定的消息循环
    while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
    //清理定时器,并释放窗口
    KillTimer(FTimer,0); DeallocateHWnd(FTimer);

    Terminate;
  finally
    FSocket.Free;
  end;
end;
cnsuyong
2013-12-30 · TA获得超过1075个赞
知道小有建树答主
回答量:767
采纳率:100%
帮助的人:435万
展开全部
线程技术,在 DOS 时代是有意义的,在 Windows 时代已经毫无意义。你写 Timer.OnTimer 事件就可以,它本身就是独立的线程。如果要防止阻塞,那么在你不确定或者不放心的地方加上一行 Application.ProcessMessages 就好。至于有没有窗口,那只是用户的视觉体验,因为窗口有 Visible 属性。
追问
我的DLL封装了使用Socket和PLC通讯的程序,我的DLL没有窗体,如果要在我的无窗体DLL里开定时器,我上网查了一下,应该要写到线程里,但是线程我不熟悉。这里我需要开定时器是由于我需要在DLL里定时发送一个数据给PLC,防止PLC掉线。
追答
Delphi 有线程 Demo ,打开看看,不要窗口就是了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式