写的一个简单定时器(非独立线程)


//Callback.h
#ifndef __CALLBACK_H__
#define __CALLBACK_H__

typedef void (*T_CallBack)(void *);
typedef struct
{
T_CallBack cb;
void *obj;
}ST_CallBack;

int __NewTimer(void* obj, int interval, bool isloop, T_CallBack cb);
void __DeleteTimer(int handle);

#define NewTimer(handle,obj,delay,isloop,CLASS,MEMBER) do{ \
union { T_CallBack cb; void (CLASS::*___M)(void); }___T; ___T.___M = &CLASS::MEMBER; handle = __NewTimer(obj, delay, isloop, ___T.cb); }while(0)

#define DeleteTimer(handle) do{ if ( handle) { __DeleteTimer(handle); handle = 0; } }while(0)

//#define NewTimer

int TimerGetDelay(int handle);
void TimerSetDelay(int handle, int delay);
void TimerStart(int handle);
void TimerStop(int handle);

#endif


//Callback.cpp

typedef struct
{
Uint32 lastticks;
bool isloop;
int delay;
ST_CallBack cb;
bool isdel;
bool ispause;
}ST_TimerTask;

static std::list<ST_TimerTask*> timerTasks;

int __NewTimer(void* obj, int delay, bool isloop, T_CallBack cb)
{
ST_TimerTask *task;

NEW_OBJ(task, ST_TimerTask);
task->isloop = isloop;
task->delay = delay;
task->cb.obj = obj;
task->cb.cb = (T_CallBack)cb;
task->lastticks = SDL_GetTicks();
task->isdel = false;
task->ispause = false;
timerTasks.push_back(task);
return (int)task;
}

void __DeleteTimer(int handle)
{
std::list<ST_TimerTask*>::iterator iter;
ST_TimerTask *task;
for (iter = timerTasks.begin(); iter != timerTasks.end(); iter++) {
task = (*iter);
if ( (int)task == handle){
task->isdel = true;
return;
}
}
}

void DeleteAllTimer(void)
{
std::list<ST_TimerTask*>::iterator iter;
ST_TimerTask *task;
for (iter = timerTasks.begin(); iter != timerTasks.end();) {
task = (*iter);
if ( task){
iter = timerTasks.erase(iter);
DELETE_OBJ(task);
}else
iter++;
}
timerTasks.clear();
}

void TimerRunning(Uint32 curticks)
{
std::list<ST_TimerTask*>::iterator iter;
ST_TimerTask *task;
for (iter = timerTasks.begin(); iter != timerTasks.end(); ) {
task = (*iter);
if ( task) {
if(curticks - task->lastticks >= task->delay){
if ( task->isdel == false && task->ispause == false)
task->cb.cb(task->cb.obj);
if (task->isdel || task->isloop == false){
iter = timerTasks.erase(iter);
DELETE_OBJ(task);
continue;
}
task->lastticks = curticks;
}
}
iter++;
}
}

int TimerGetDelay(int handle)
{
ST_TimerTask *task=(ST_TimerTask*)handle;
return task->delay;
}

void TimerSetDelay(int handle, int delay)
{
ST_TimerTask *task=(ST_TimerTask*)handle;
task->delay = delay;
}
void TimerStart(int handle)
{
ST_TimerTask *task=(ST_TimerTask*)handle;
task->ispause = false;
}
void TimerStop(int handle)
{
ST_TimerTask *task=(ST_TimerTask*)handle;
task->ispause = true;
}


 

写的一个简单定时器(非独立线程)

时间: 2024-10-16 18:22:20

写的一个简单定时器(非独立线程)的相关文章

虚幻4,BP写了一个简单的三线跑酷工程

BP写了一个简单的三线跑酷 链接: http://pan.baidu.com/s/1jILE4V8 密码: 96ua

java写的一个简单学生管理系统[改进]

用Java写的一个简单学生管理系统 import java.util.*; public class student_cj {  public static void main(String[] args){      Scanner in=new Scanner(System.in);   System.out.print("请输入学生人数:");   int num=in.nextInt();//学生人数   String[] str=new String[num];//结合一行数

写了一个简单的CGI Server

之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看,对于学生来说,拿来当简历,含金量还是足够的.如果把程序里所涉及的HTTP协议,Linux下POSIX编程等等搞清楚,我想找工作中肯定是有足够的竞争力的,当然我也只是皮毛而已,不再班门弄斧了,下面简单的说下程序流程吧,方便小伙伴们阅读. 程序源代码:戳我 在说程序流程之前,我先简单说下CGI吧,CG

用qt写的一个简单到不能在简单的上位机

学QT时,写的一个简单得不能再简单的串口上位机,用来控制单片机上的2个LED.假设一个是只有开和关的状态.一个可以调节亮度.上位机的界面如下图: 其中,波特率,数据位,停止位下拉值在设计师里面添加.剩下的功能,基本由代码实现.通信使用的协议也是随便写的.很简单和随意.图片是老弟手绘的. 下面贴代码 (*^__^*) #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort

写了一个简单可用的IOC

根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录    只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免陷入细节中.学习过程最大的收获,框架也是人写的,没学过感觉很神秘高端.现在看来大概率是,未知往往觉得是高不可攀.http://naotu.baidu.com/file/6c3da879a4495b6bd369f71dcb726f05?token=ed8c0d49d4ee7bbd 原文地址:https://ww

浮动布局写了一个简单的页面

正在学习的路上...... 这两天写了一个比较简单的页面,主要使用了浮动和定位.左边的属于滚动页面,右边的list属于固定.先上图片: 主要使用了float:left/right. 1.下面是HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link type="

写了一个简单的jquery插件(初恋啊)

用了好久的jquery了,却没有写过插件,今天研究了一个别人的插件和一些文章,总算搞清楚了jquery插件一些写法, 代码写了一个div当鼠标事件发生时的宽高变化情况,基础,代码基础,基础好了,才能研究深入的东西. 1 (function(jQuery){ 2 /* 3 * 插件应该返回一个JQuery对象,以便保证插件的可链式操作. 4 * JQuery插件的机制:jQuery提供了2个用于扩展jQuery功能的方法 5 * jQuery.fn.extend() 6 * jQuery.exte

自己写的一个简单的迅雷下载支持断点续传

当我学习了网络线程,就自己仿照迅雷下载写了一个下载器,支持断点续传 我用的是SWT插件做的界面 界面 package com.yc.xunlei; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Arra

利用HttpClient写的一个简单页面获取

之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClient是哪个版本的,而且HttpClient版本不一样,导致后面很多类也不一样.于是下载了最新的HttpCient版本,并且对着tutorial和网上的文档试着写一个简单的获取页面的例子,最终证明是可行的,但是也遇到了不少问题,而且这个例子也十分简单. import java.io.IOExcepti