随笔 - 809  文章 - 0 评论 - 144 阅读 - 770万

定时器的中断级别很低,如果你的业务数据自动处理过程对实时性要求不高也可以选择timer,线程是基于系统分配CPU时间片来工作的,对于实时性高,响应快要求高的处理过程最有用。


最重要的,线程不会让界面死锁。

 

----------------------------------------------------------------------

如果程序现在正在执行a事件,timer事件激活了,需要去处理b事件。
程序是怎么运行呢?
是先处理完a事件,再去处理b事件
暂停a事件,先去处理b事件,处理完b,再回来处理a事件。
还是a、b事件同时处理? 
Timer的OnTimer是在主线程中执行的,如果这个时候其他事件正在执行,会等到执行完之后才响应OnTimer的,
如 Button.OnClick执行时,是不会触发OnTimer的,除非在OnClick中执行了Application.ProcessMessages或者其他等同的执行(注意如果OnClick中有执行FormXX.ShowModule
不在此范围内)

如kiboisme所说,要等a事件循环完成,才会执行时钟事件

经典例子:

复制代码
var
  Form1: TForm1;
  k: Integer;
  Ti: TTimer;
implementation

{$R *.dfm}

procedure Tform1.tionTimer(sender: Tobject);
begin
  Inc(k);
  Button1.Caption := IntToStr(k);
   if k > 20 then
   Ti.Enabled:=False ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  Ti := TTimer.Create(self);
  Ti.OnTimer := tionTimer;
  Ti.Interval := 1000;
  Ti.Enabled := False;
  for i := 1 to 10 do
  begin
    Sleep(1000);
    Button2.Caption := IntToStr(i);
    if i > 5 then
      Ti.Enabled := True;
  end;
end;
复制代码

timer是一个低等级时间,如楼上所说,要么等待,要么丢弃。

 

 

-------------------------------------------------------------------------------

OnTimer()只是说定时触发,并不说它是“后台处理”,它仍会阻塞UI线程的;

OnTimer并不是后台线程,它同UI一个线程,所以如果占用UI线程时间过长会阻碍界面过程.

WM_TIMER的优先级比较低,对于要求实时更新的程序不适合,线程的优先级比较高,但是消耗的资源也多一些

(OnTimer)的实现是否属于多线程技术?

楼主yangchengl(爱在今生)2006-05-01 10:17:31 在 VC/MFC / 基础类 提问

请解释一下,谢谢! 问题点数:10、回复次数:14Top

 

1 楼lisypro()回复于 2006-05-01 10:53:25 得分 1

应该是  
  但是不是标准的多线程Top

2 楼lonely001(独行客)回复于 2006-05-01 11:01:55 得分 0

不是Top

3 楼lonely001(独行客)回复于 2006-05-01 11:03:37 得分 2

ONTIMER只是WINDOWS内置的消息发生器产生的消息,ONTIMER消息也是要排队的,这就是为什么ONTIMER很多时候并不精确的原因Top

4 楼lyl_rabbit(阿牛)回复于 2006-05-01 13:53:06 得分 0

不是,但多线程是通过时间分片实现的Top

5 楼zh2817()回复于 2006-05-01 14:44:10 得分 0

不是Top

6 楼Featured(我握着爱情的门票静静排队……)回复于 2006-05-01 15:18:08 得分 0

不是。  
  但比较特殊。准确地说应该是“中断”技术Top

7 楼yangchengl(爱在今生)回复于 2006-05-01 18:14:35 得分 0

这样说对不对,ONTIMER实现了若干段程序的并行运行,但它并不是为各段程序创建了对应的线程,而是采用了软中断技术。Top

8 楼soaroc(会飞的猪)回复于 2006-05-01 21:28:09 得分 0

ONTIMER实现了若干段程序的并行运行  
  -----------------------------------------------------------------------------------  
  对于单CPU来说,是不可能实现程序段的并行运行的,只能是交替运行。像上面的某一楼所说的,其实它与其他的消息没有什么大的区别,只不过此消息的入队是循环的。Top

9 楼yangchengl(爱在今生)回复于 2006-05-02 08:30:41 得分 0

它与其他的消息没有什么大的区别,只不过此消息的入队是循环的。  
  这一点解释的好。  
  我说的并行是指宏观上并行。在一定时间内这些程序段都获得了执行的机会。Top

10 楼BXAllen()回复于 2006-05-02 20:57:03 得分 0

是单线程的!Top

11 楼BXAllen()回复于 2006-05-02 21:01:03 得分 4

mfc在cwnd中的ontimer是调用的api的settimer函数,可以在帮助文档中找到的.调用的函数是通过一个函数指针.如果是多线程的,那么是不可以通过像他定义的那样的函数指针实现的.至于函数的原型,可以自己查一下看看就明白了!  
  Top

12 楼mjm_d(菠萝蜜多)回复于 2006-05-03 14:02:00 得分 0

不是系统级的  
  但是你可以用它模拟一些简单的不要求精确的用户自定义级别的线程Top

13 楼roscoe(草上飞)回复于 2006-05-03 15:43:45 得分 3

不是多程技术,但应是协作式多任务,线程是抢占式多任务

posted on   del88  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示