• 【C++服务端技术】定时器


    这个设计每调用一次就会重新注册,欢迎交流

    #include <iostream>
    #include <map>
    #include <vector>
    #include <time.h>
    #include <windows.h>
    #include <stdio.h>
    using namespace std;
    
    struct tagTime
    {
    	long long llStarTime;
    	int		  iCount;
    	int		  iSpace;
    	int       iParam;
    };
    
    map<long long, vector<tagTime>> TimeList;
    
    /*利用map如果key是整形,会自动从小到大排序,
      我们可以把定时器先到期的key更小
      由于相同时间到期的会重复,所以还得去重
      那可以用二维结构,map<key,vector>,刚好vector是pushback有序的
    */
    
    bool RegTimer(tagTime &Timer)
    {
    	//cout<<Timer.llStarTime<<endl;
    	map<long long, vector<tagTime>>::iterator It = TimeList.find(Timer.llStarTime);
    	if(It == TimeList.end())
    	{
    		vector<tagTime> vTimelist;
    		vTimelist.push_back(Timer);
    		TimeList[Timer.llStarTime] = vTimelist;
    	}
    	else
    	{
    		It->second.push_back(Timer);
    	}
    	return true;
    }
    
    void UpdateTimer()
    {
    	if(TimeList.size() <= 0)
    		return;
    	map<long long, vector<tagTime>>::iterator It = TimeList.begin();
    	if(time(NULL) < It->first)
    	{
    		//cout<<"000"<<time(NULL) <<" "<< It->first<<endl;
    		return;
    	}
    
    	vector<tagTime> *vTimeList = &(It->second);
    	if(vTimeList->size() <= 0)
    	{
    		//cout<<"111"<<endl;
    		return;
    	}
    
    	vector<tagTime>::iterator vIt = vTimeList->begin();
    	for(; vIt != vTimeList->end(); vIt++)
    	{
    		tagTime Timer = *vIt;
    		cout<<Timer.iCount<<" "<<Timer.iParam<<endl;
    		Timer.iCount--;
    		Timer.llStarTime = Timer.llStarTime + Timer.iSpace;
    		if(0 < Timer.iCount)
    		{
    			RegTimer(Timer);
    		}
    	}
    	vTimeList->clear();
    	TimeList.erase(It);
    }
    
    void main()
    {
    	tagTime Timer;
    	Timer.iCount = 10;
    	Timer.iParam = 5201314;
    	Timer.iSpace = 1;
    	Timer.llStarTime = time(NULL);
    	RegTimer(Timer);
    
    	Timer.iParam = 141414;
    	Timer.iSpace = 2;
    	RegTimer(Timer);
    	while (true)
    	{
    		UpdateTimer();
    		Sleep(100);
    	}
    	system("pause");
    }
  • 相关阅读:
    常用纹理数据库
    开源许可协议
    3TB-GPT-MBR
    ubuntu配置cudnn
    神经网络模型种类
    What is R语言
    DataWindow.NET 控件 实现点击列头排序
    PB调用C# Windows窗体
    工商银行卡网上查询开户行
    【DevExpress】1、SearchLookUpEdit详解
  • 原文地址:https://www.cnblogs.com/byfei/p/14104074.html
Copyright © 2020-2023  润新知