自己写的一个多进程的定时器类方便使用,放在bolg里

本文介绍了一个使用 C++ 实现的定时器类,该类能够添加、删除定时器,并通过定时检测来触发定时任务。定时器类中包含了定时器的创建、运行和清理等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 定时器类声明文件

//cMyTimer.h

#pragma once

#include "string"
#include "list"
using namespace std;


struct stTimer
{
    unsigned timeElapce; //定时器间隔运行时间
    unsigned timeCreate; //定时器创建时间
    unsigned timeLastRun; //定时器上次执行时间
    unsigned id; //定时器ID号
    int iParam; //预留参数
    string strParam; //预留参数
    bool bDel; //是否已被删除


    stTimer()
    {
        timeCreate = 0;
        timeLastRun = 0;
    id = -1;
    iParam = 0;
    bDel = false;
    }
};


typedef list<stTimer> stTimerList;
typedef list<stTimer>::iterator itTimerList;


class cMyTimer
{
    public:
    cMyTimer();
    virtual ~cMyTimer();


    //添加定时器
    void AddTimer(unsigned timerId, unsigned timeMs,int param = 0,
    char* p=NULL);
    //删除定时器
    void DeleteTimer(int id);


    //定时器处理
    virtual int OnTimer(int id,int iParam,string str) = 0;

    //检测定时器运行
    bool TimerRun();

    //清除所有定时器
    void ClearTimer();
    //定时检测删除定时器
    void CheckDelTimer();
    private:
    stTimerList m_timerList; //定时器列表

};

定时器类定义文件

//cMyTimer.cpp

#include "stdafx.h"
#include "cMyTimer.h"
#include "windows.h"
#include "process.h"


cMyTimer::cMyTimer()
{

}


cMyTimer::~cMyTimer()
{
    ClearTimer();
}


void cMyTimer::ClearTimer()
{
    for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
    {
        it->bDel = true;
    }
}




void CheckTimerRun(void* p)
{
    cMyTimer* pTimer = (cMyTimer*)p;
    if (pTimer == NULL)
    {
        return;
    }
    while(1)
    {
        pTimer->CheckDelTimer();

        //检测是否有定时器要运行
        if(!pTimer->TimerRun())
        {
            _endthread();
        }
        Sleep(20);
    }
}


//添加定时器
void cMyTimer::AddTimer(unsigned timerId,unsigned timeMs,int param,char* p)
{
    if (timeMs == 0)
    {
        return;
    }
    stTimer stTimerTemp;
    stTimerTemp.bDel = false;
    stTimerTemp.id = timerId;
    stTimerTemp.iParam = param;
    if (p != NULL)
    {
        stTimerTemp.strParam = p;
    }

    unsigned timeNow = GetTickCount();
    stTimerTemp.timeCreate = timeNow;
    stTimerTemp.timeLastRun = timeNow;
    stTimerTemp.timeElapce = timeMs;
    m_timerList.push_back(stTimerTemp);
    if (m_timerList.size() == 1)
    {
        //说明此时是第一个定时器
        _beginthread(CheckTimerRun,0,this);
    }
}


//删除定时器
void cMyTimer::DeleteTimer(int id)
{
    for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
    {
        if (it->id == id)
        {
            it->bDel = true;
            return;
        }
    }
}








//定时器处理
//int cMyTimer::OnTimer(int id,int iParam,string str)
//{
//     return 1;
//}




//定时检测删除定时器
void cMyTimer::CheckDelTimer()
{
    for (itTimerList it = m_timerList.begin();it != m_timerList.end();)
    {
        if (it->bDel)
        {
            m_timerList.erase(it);
            it = m_timerList.begin();
            continue;
        }
        ++it;
    }
}


bool cMyTimer::TimerRun()
{
    if (m_timerList.size() == 0)
    {
        return false;
    }
    unsigned timeNow = GetTickCount();
    for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
    {
        if (timeNow>=it->timeLastRun + it->timeElapce)
        {
            it->timeLastRun = timeNow;
            if(OnTimer(it->id,it->iParam,it->strParam) == 0)
            {
                //删除定时器
                it->bDel = true;
            }
            continue;
        }
    }
    return true;
}

 

<think>嗯,用户的问题是关于在公有云上为运行LNMP+WordPress的云主机扩容存储空间。之前已经给过一些解决方案,但用户似乎希望更聚焦于云平台提供的扩容功能,特别是参考了提供的ECS文档片段。用户可能实际面临两种场景:要么是系统盘不够用导致无法更新或入日志,要么是网站数据(尤其是媒体库)膨胀过快。从技术文档看,云平台确实提供两种扩容路径——直接扩大原有磁盘或添加新数据盘,这点和AWSEBS或阿云云盘的操作逻辑一致。注意到用户引用的文档提到关键细节:"按量付费实例需先转包年包月才能扩容",这个限制很容易被忽略但很重要,应该在方案突出提醒。另外文档提到"扩容后需重启ECS",这在生产环境是需要谨慎处理的点,需要给用户补充无损重启方案。考虑到用户使用WordPress,其实除了硬件扩容,还可以在应用层减压:比如用云存储分流媒体文件这个方案性价比很高。不过用户特别强调要参考云平台文档,所以重点应该放在:1控制台操作流程(扩容/挂载新盘)2文件系统层面的扩展操作(特别是resize2fs命令)3扩容后的目录迁移方案(如把/var/www迁移到新盘)用户似乎对纯命令操作有些顾虑,所以回复加入了具体的fdisk交互步骤(分区创建)和blkid使用示例(UUID绑定)。这些在Linux运维中都是标准操作,但对新手可能容易出错,需要分步骤说明。安全方面特别提醒了快照重要性——毕竟存储操作有风险,阿云自己的文档也强调这点。最后补充的"无需重启"方案可能更符合用户需求(毕竟网站停机代价大),通过软链接迁移WordPress上传目录到新分区是个实用技巧。</think> 根据您的LNMP+WordPress架构和云服务特性,以下是完整的存储空间不足解决方案(结合操作步骤和平台特性): --- ### 一、存储诊断与清理(优先操作) 1. **查看磁盘使用** ```bash df -hT # 查看分区使用情况 du -sh /var/* # 分析大目录 ``` *重点关注:`/var/log/`(日志)、`/var/www/`(网站)、`/var/lib/mysql/`(数据库)* 2. **清理策略** - **日志清理**: ```bash sudo journalctl --vacuum-size=100M # 限制系统日志大小 sudo rm /var/log/nginx/*.log # 删除旧Nginx日志(先停止Nginx) ``` - **WordPress缓存**: 使用`WP-Optimize`插件清理数据库冗余数据[^1] - **无用文件**: ```bash sudo apt autoremove # 删除无用软件包 sudo rm -rf /tmp/* # 清理临时文件 ``` --- ### 二、云平台扩容操作(核心方案) #### ▶ 方案1:原磁盘扩容(推荐)[^1] 1. **控制台操作** - 在云控制台找到实例 → 停止实例 → 调整系统盘/数据盘容量 - *注意:按量付费需先转包年包月,扩容后需重启实例* 2. **扩展文件系统**(以ext4为例): ```bash sudo growpart /dev/vda 1 # 扩展分区(设备名需替换) sudo resize2fs /dev/vda1 # 调整文件系统大小 ``` #### ▶ 方案2:挂载新数据盘[^1] 1. **控制台操作** 购买新云盘 → 挂载到同可用区实例 → 重启生效 2. **配置新盘**: ```bash sudo mkfs.ext4 /dev/vdb # 格式化新盘 sudo mkdir /mnt/wordpress_data # 创建挂载点 sudo mount /dev/vdb /mnt/wordpress_data # 挂载 ``` 3. **迁移数据**: ```bash sudo systemctl stop nginx php-fpm # 停止服务 sudo mv /var/www/* /mnt/wordpress_data/ # 迁移网站数据 sudo ln -s /mnt/wordpress_data /var/www/html # 创建软链接 ``` --- ### 三、应用层优化(减轻存储压力) | 优化项 | 实施方式 | |-----------------|-------------------------------------------------------------------------| | **媒体文件分流** | 使用云存储OSS/COS存放图片视频,通过`WP Offload Media`插件同步[^2] | | **日志外存** | 配置Nginx日志输出到云日志服务: ```nginx access_log /dev/stdout; error_log /dev/stderr; ``` | | **自动清理** | 设置Crontab定时清理: ```bash 0 3 * * * find /var/log/nginx -name "*.log" -mtime +7 -delete ``` | --- ### 四、安全与验证 1. **操作前必做**: - 创建磁盘快照 [^1] - 备份数据库:`mysqldump -u root -p wordpress > wp_backup.sql` 2. **验证步骤**: ```bash df -hT # 确认扩容后大小 ls -l /var/www/html # 检查软链接有效性 sudo systemctl restart nginx # 重启服务测试 ``` > ⚠️ **关键提示** > 1. 阿云扩容后需`重启实例`生效(腾讯云支持在线扩容) > 2. 按量付费实例需转`包年包月`才能扩容[^1] > 3. 生产环境建议在业务低峰期操作 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值