用Win32,寫乙個自定義的定時器

2021-08-07 14:27:13 字數 2878 閱讀 2628

建立乙個自定義定時器,其重點在於如何定時。

我的解決方案是適合採用觀察者模式,分為主題類cpdstimersub和觀察者類cpdstimerobj ,這個兩個類分別繼承ipdstimersub和ipdstimerobj介面 .

#pragma once

#include "stdafx.h"

#include

class ipdstimer

;virtual ~ipdstimer(){};

public:

/// @brief響應函式

virtual void ontimer() = 0;

};class ipdstimerobj : public ipdstimer

;virtual ~ipdstimerobj(){};

public:

/// @brief設定定時器,nid定時器id,ntimersplit間隔時間

virtual void settimer(unsigned int nid, unsigned int ntimersplit) = 0;

/// @brief設定新的定時器,並返回新的定時器id

virtual unsigned int setnewtimer(unsigned int ntimersplit) = 0;

/// @brief銷毀定時器

virtual void killtimer(unsigned int nid) = 0;

public:

/// @brief計時

virtual void counttime() = 0;

};class ipdstimersub

;virtual ~ipdstimersub()

;public:

/// @brief註冊定時器

virtual bool registertimer(unsigned int nid, ipdstimerobj* timerobj) = 0;

/// @brief反註冊定時器

virtual bool unregistertimer(unsigned int nid) = 0;

/// @brief通知所有定時器

virtual void notifyalltimer() = 0;

public:

std::mapm_mapidtimers;

};在主題類中建立乙個執行緒,執行緒每隔一秒,去通知所有觀察者類過了一秒了。

#pragma once

#include "ipdstimer.h"

#include

#include

class cpdstimersub : public ipdstimersub

;#include "stdafx.h"

#include "pdstimersub.h"

ipdstimersub* cpdstimersub::m_instance = nullptr;

static unsigned int g_nthreadid = 10086;

dword winapi threadfun(lpvoid pm)

;long lstarttime = gettickcount();

while(1) }

return 0;

} cpdstimersub::cpdstimersub()

cpdstimersub::~cpdstimersub()

bool cpdstimersub::registertimer(unsigned int nid, ipdstimerobj* timerobj)

bool cpdstimersub::unregistertimer(unsigned int nid)

}return false;

}void cpdstimersub::notifyalltimer()

}ipdstimersub* cpdstimersub::getinstance()

return m_instance;

}這樣的話,每個觀察者類就可以自己去計時,時間到了,就去執行響應函式

#pragma once

#include "ipdstimer.h"

class cpdstimerobj : public ipdstimerobj

;#include "stdafx.h"

#include "pdstimerobj.h"

#include "pdstimersub.h"

cpdstimerobj::cpdstimerobj(void)

: m_ntimesplit(1000)

, m_nrealtime(0)

, m_ntimerid(0)

, m_ppdstimersub(nullptr)

cpdstimerobj::~cpdstimerobj(void)

void cpdstimerobj::settimer(unsigned int nid, unsigned int ntimersplit)

void cpdstimerobj::killtimer(unsigned int nid)

void cpdstimerobj::counttime()

}void cpdstimerobj::ontimer()

unsigned int cpdstimerobj::setnewtimer(unsigned int ntimersplit)

}nnewid++;}}

return 0;

}測試如下:

#include "stdafx.h"

#include "pdstimerobj.h"

#include "pdstimersub.h"

int _tmain(int argc, _tchar* argv)

Win32 自定義本地資源dll

這裡是記錄我的經驗,沒啥技術含量的,小白這廂有禮了 最近在寫乙個服務框架,這個服務框架是給別人用於開發服務用的.開發人員使用服務的時候,需要使用一些認證用的授權檔案,每個服務都需要有個授權檔案.此時,不幸的是,我的框架裡面也用到了一些授權檔案,用來嵌入部分具體的系統服務.那麼問題來了,如果韓梅梅使用...

WIN32傳送自定義訊息

在win32訊息機制中,系統會傳送各種訊息到訊息佇列,開發可以呼叫getmessage得到相關訊息。win32的api也提供了對應開發自行的傳送訊息到訊息佇列的功能.sendmessagea直接傳送訊息到對應的視窗處理函式中,直到處理後函式才返回。postmessagea將資訊放入訊息佇列中,立即返...

win32 寫乙個檔案 (同步阻塞寫的方式)

com en us library windows desktop bb540534 v vs.85 aspx建立乙個新檔案,並且同步寫乙個字串到檔案中去。建立乙個vs2010 控制台 程式 writefile.cpp 定義控制台應用程式的入口點。include stdafx.h include i...