定时器非多线程

本文由 代码助手软件 整理发布 内容与本软件无关
更惬意的读、更舒心的写、更轻松的发布

首先,要说明的是:定时器使用感觉像是一个线程,但其实并不是多线程。

他是通过消息触发实现的,通过SetTimer函数设定定时器后,在规定的时间内向消息队列中加入WM_TIMER来触发事件,并且只有该消息返回后才处理下个消息。

定时器是系统消息,如同左键按下消息一样,所以需要添加此定时器消息

ON_WM_TIMER()
    afx_msg void OnTimer(UINT nIDEvent);
void CView::OnTimer(UINT nIDEvent)
{
    CScrollView::OnTimer(nIDEvent);
}

加入定时器消息后,要想触发定时器,你总要告诉机器多久触发一次吧,所以要设置定时时间SetTimer

设置后,就告诉了机器,自此时,要隔某段时间触发一次定时器消息。

SetTimer(m_nID,60,NULL); //60MS m_nID为定时器事件ID

当时间满足时,变会触发定时器消息,因此在定时器消息函数中处理事件

void CMainFrame::OnTimer(UINT nIDEvent)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  if(nIDEvent == m_ nID)
  {
  }
  CFrameWnd::OnTimer(nIDEvent);
}

当解决问题后,不想再使用定时器时,需要将其关闭

KillTimer(m_nID);

错误使用:

    SetTimer (1,300,NULL);
    m_nNum=0;
    while(1)
    {
        if (m_nNum>20)
        {
            break;
        }
    }
    KillTimer (1);

在定时器事件中 将m_nNum不断增加,可是调试时发现,定时器事件一直不触发。

所以,由此看出定时器不是线程。

修改为:

void CRichEditDlg::OnSelectGroup ()
{
    CString currentDirectory;
    currentDirectory=theApp.exeDirectory+L"\\res\\音效\\声音\\";
    currentDirectory+=L"gu.wav";
    PlaySound(currentDirectory, NULL, SND_ASYNC | SND_FILENAME |SND_LOOP);
    SetTimer (1,300,NULL);
    m_nNum=0;
}
void CRichEditDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (nIDEvent==1)
    {
        m_pView->RandScoreChunk ();
        m_pView->Invalidate ();
        m_nNum++;
        if (m_nNum>20)
        {
            KillTimer (1);
            PlaySound(NULL, NULL, SND_ASYNC | SND_FILENAME );
        }
    }
    CDialogEx::OnTimer(nIDEvent);
}
时间: 2024-11-18 13:36:02

定时器非多线程的相关文章

定时器在多线程中的使用

在多线程中使用定时器必须开启Runloop,因为只有开启Runloop保持现成为活动状态,才能保持定时器不断执行 - (void)viewDidLoad { [super viewDidLoad]; [self performSelectorInBackground:@selector(testMultiThread) withObject:nil]; } - (void) testMultiThread { NSAutoreleasePool * pool = [[NSAutoreleaseP

C#多线程学习之(五)使用定时器进行多线程的自动管理

本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: ? 1 Timer timer = new Timer(timerDelegate, s,1000, 1000); 第一个参数:指定了TimerCallback 委托,表示要执行的方法:第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用:第三

一个比较多线程(并行)和非多线程下完成同等任务(I/O频繁)所需开销的案例

//非多线程 package test; import java.io.*; import java.security.DigestInputStream; import java.security.MessageDigest; /* * 利用DigestInputStream完成消息摘要计算, * 先调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest方法. * 本案例包含两个程序,其中一个采用多线程,相互比较. */ public class DigestTh

Java中基本知识梳理【定时器实现多线程】-----2015年3月15日

Timer介绍: (1)基本方法: public Timer():创建一个新计时器.相关的线程不 作为守护程序运行. public void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.以近似固定的时间间隔(由指定的周期分隔)进行后续执行. public void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务.如果此时间已过去,

PyQt5信号、定时器及多线程

信号 信号是用于界面自动变化的一个工具,原理是信号绑定了一个函数,当信号被触发时函数即被调用 举个例子 from PyQt5 import QtWidgets,QtCore from untitled import Ui_Form import time class MyWindow(QtWidgets.QWidget,Ui_Form): _signal=QtCore.pyqtSignal(str) #定义信号,定义参数为str类型 def __init__(self): super(MyWin

QTcpSocket服务器 定时器,多线程结合

QTcpsocket 写服务器程序时,需要定时向客户端发送监控数据,同时需要响应客户端请求. 问题是: QTcpSocket 只能在同一个线程中使用,定时器会在主线程中运行 解决方案:在定时器中发送信号给封装的客户端数据处理socket,并在线程中将该信号与socket中的操作相连接. //clientsocket.h #ifndef CLIENTSOCKET_H #define CLIENTSOCKET_H #include <QTcpSocket> #include <QTimer&

setTimeout()和setInterval() 何时被调用执行(非多线程).RP

定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除. 从定义上我们可以看到两个函数十分类似,只不过前者执行一次,而后者可以执行多次,两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒数. 很简单的定义,使用起来也很简单,但有时候我们的代码并不是按照我们

博客园文章转PDF之非多线程方式

问题: 现在博客园写的文章想要在自己本地存一份,一个一个复制有点麻烦,希望能够程序化解决这个问题 思路: 博客园园第二页会出现页码,可以通过请求第二页,获得页面信息,然后把总页码获取到 每个页面的地址一样除了页码的地方不一样,因此,循环总页码,就可以得到每一个文章列表页的内容 得到了文章列表页的内容,可以把每个文章列表的文章链接获取到,且放在list中 循环文章链接,访问文章页面,获取文章标题和内容,并加上head,得到文章HTML且排除了左边栏及上下底部 把生成的HTML且排除了非文章内容的文

.NET多线程编程

在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知识,诸如System.Threading命名空间的重要类以及方法,并就一些例子程序来作说明. 引言 早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候.由于计