没有窗体怎么使用定时器呢?

要追问请引用回复 2006-11-12 06:56:01
做那中简单的程序的时候(不是控制台程序),想要使用API函数SetTimer来设置定时器,请问应该怎么写代码呢,关键是那个HWND应该是什么呢,我没有窗体怎么设置
...全文
416 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
AllocateHWnd 用这个
  • 打赏
  • 举报
回复
HandleAllcoate
baiduan 2006-11-17
  • 打赏
  • 举报
回复
我的这个行吗?

procdure Tmythread.execute;
var
t1,t2:Dword;
begin
t1:=gettickcount;
t2:=gettickcount;
while ((t2-t1)<10000) do
begin
...
t2:=gettickcount;
sleep(500);
end;
end;
王集鹄 2006-11-16
  • 打赏
  • 举报
回复
//测试通过

program Project1;

uses
Windows,Dialogs;

procedure TimerProc(hWindow:HWND; uMsg:UINT; idEvent:UINT; dwTime:DWORD);stdcall;
begin
Showmessage('a');
end;

var Msg: TMsg;

begin
SetTimer(HWND(nil),1,3000,@TimerProc);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg); //〈〈〈add
end;
KillTimer(HWND(nil),1);
end.
ahjoe 2006-11-16
  • 打赏
  • 举报
回复
// DELPHI写程序可以没有窗体.
// 新建一个Application,然后关闭 Unit1,不要保存。再ALT + P, V,修改为以下代码

program Project1;

uses
// Forms;
Windows;

{$R *.RES}

var
i: integer;
begin
for i := 0 to 100 do
begin
Sleep(1000);
end;
// Application.Initialize;
// Application.Run;
end.
ccrun.com 2006-11-13
  • 打赏
  • 举报
回复
也可以使用多媒体定时器:

timeSetEvent
  • 打赏
  • 举报
回复
Delphi才不是必须要窗体呢,从Project菜单中选择Remove From Project 就可以删掉自动生成的窗体,代码可以在工程文件的benin end.之间添加,这样的话就没有窗体了,明明用不到前台界面的话,再添加一个隐藏的窗体进去,总是感觉有点多余

我要研究下楼上的代码先
comanche 2006-11-13
  • 打赏
  • 举报
回复
晕, 楼上的等于没说嘛
怎么可能没窗体呢?这是 delphi,至少也要个主窗体才能运行的.

不过可以考虑自写一线程作 timer 的嘛, 简单得很

procedure xxx.Execute;
begin
while not Terminated do
begin
if FTimerEvent := TEVent.WaitFor(FInterval) = wrTimeout then
Synchronize(DoTimer); 你爱挂哪挂哪
end;
end;
Rex_love_Burger 2006-11-13
  • 打赏
  • 举报
回复
到MSDN看SetTimer的帮助
  • 打赏
  • 举报
回复
分数什么的怎么处理?不知道啊
  • 打赏
  • 举报
回复
问题终于解决了,楼上不对,由于没有使用Forms单元,何来Application?
我认为,窗口句柄不见得那么必需,我解决的时候是在大循环中加入DispatchMessage函数,这样才能将WM_TIMER消息送到预先定义的回掉函数?虽然仍有不解,但是代码工作的很好,CPU使用率也没有什么异常
comanche 2006-11-13
  • 打赏
  • 举报
回复
楼主要求 BT 哈, Application.Handle 试过不行的话就可以考虑用线程了吧, 要不然的确是作不了
gogogo 2006-11-13
  • 打赏
  • 举报
回复
仔细看看我1、2 楼的分析,不要想当然
gogogo 2006-11-13
  • 打赏
  • 举报
回复
楼上说的好,“消息队列”,就是这个,没有窗口,谁检索这个呢?
comanche 2006-11-13
  • 打赏
  • 举报
回复
窗口句柄是一定要的, timer 要求进入消息队列
comanche 2006-11-13
  • 打赏
  • 举报
回复
这样哈, 这样倒是没想过, 不过也行, Application.Handle 是任务栏上的那个 hwnd 不知道能不能用作 timer 用
  • 打赏
  • 举报
回复
program Project1;

uses
Windows,Dialogs;

procedure TimerProc(hWindow:HWND; uMsg:UINT; idEvent:UINT; dwTime:DWORD);stdcall;
begin
Showmessage('a');
end;

var Msg: TMsg;

begin
SetTimer(HWND(nil),1,3000,@TimerProc);
while GetMessage(Msg, 0, 0, 0) do TranslateMessage(Msg);
KillTimer(HWND(nil),1);
end.


我是这样写的
可是为什么没有显示对话框?
gogogo 2006-11-12
  • 打赏
  • 举报
回复
毕竟时钟也是一个事件,必须用消息队列,有消息队列,一般就必须制定什么窗体接受这个消息队列。
看了你的要求,我想很多人碰到过你的想法,包括本人,但是你有这种想法,如果不是服务程序,只能说明你的程序体系没有构思好,构思好了,就不会有你这种想法,或者说很容易找到解决方法。
gogogo 2006-11-12
  • 打赏
  • 举报
回复
简单的方法,就是用一个隐藏的窗体,好像没有窗体是不能成为一个程序的,除非你做的是服务程序,你如果做过c写windows程序就会对这一点有比较深的认识了。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧