⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firealarm.cpp

📁 window下的多线程编程参考书。值得一读
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include "CMcl.h"
#include "CSag.h"

class CSmokeDectector : public CMclThreadHandler {
private:
    void (*m_pfnFireDetected)(void);

public:
    CSmokeDectector(void (*pfnFireDetected)(void)) {
        m_pfnFireDetected = pfnFireDetected;
    };

    unsigned ThreadHandlerProc() {
        // for this example, we'll just wait 2 seconds
        // and then report that we have detected a fire...
        Sleep(2000);
        printf("Detected Smoke!\n");
        (*m_pfnFireDetected)();

        // all done...
        return 0;
    };
};

class CHeatDectector : public CMclThreadHandler {
private:
    void (*m_pfnFireDetected)(void);

public:
    CHeatDectector(void (*pfnFireDetected)(void)) {
        m_pfnFireDetected = pfnFireDetected;
    };

    unsigned ThreadHandlerProc() {
        // for this example, we'll just wait 2 seconds
        // and then report that we have detected a fire...
        Sleep(2000);
        printf("Detected Heat!\n");
        (*m_pfnFireDetected)();

        // all done...
        return 0;
    };
};

class CInfraRedDectector : public CMclThreadHandler {
private:
    void (*m_pfnFireDetected)(void);

public:
    CInfraRedDectector(void (*pfnFireDetected)(void)) {
        m_pfnFireDetected = pfnFireDetected;
    };

    unsigned ThreadHandlerProc() {
        // for this example, we'll just wait 2 seconds
        // and then report that we have detected a fire...
        Sleep(2000);
        printf("Detected Infra-Red!\n");
        (*m_pfnFireDetected)();
        
        // all done...
        return 0;
    };
};

void SoundAlarm(void) {
    printf( "Alarm! Alarm!\n");
}

void NotifyFireDepartment() {
    // for this example pretend it takes 10 seconds
    // to notify the fire department...
    printf( "Calling Fire Department...\n");
    Sleep(10000);
    printf( "Notifed Fire Department!\n");
}

void FireDetected(void) {
    static CSingleAdmissionGate csag;

    // try to enter the single admission gate...
    if (csag.Try() == FALSE) {
        printf( "Fire already detected.\n");
        return;
    }

    // sound the alarm and phone the fire department...
    SoundAlarm();
    NotifyFireDepartment();

    // done...
    csag.Leave();
}

int main( int argc, char *argv) {
    // thread handlers...
    CSmokeDectector chDetectSmokeHandler(FireDetected);
    CHeatDectector chDetectHeatHandler(FireDetected);
    CInfraRedDectector chDetectInfraRedHandler(FireDetected);

    // thread auto-pointer objects...
    CMclThreadAutoPtr ctDetectSmoke;
    CMclThreadAutoPtr ctDetectHeat;
    CMclThreadAutoPtr ctDetectInfraRed;

    // create the threads...
    ctDetectSmoke = new CMclThread( &chDetectSmokeHandler);
    ctDetectHeat = new CMclThread( &chDetectHeatHandler);
    ctDetectInfraRed = new CMclThread( &chDetectInfraRedHandler);

    // wait for a fire...
    CMclWaitableCollection dectectors;
    dectectors.AddObject(*ctDetectSmoke);
    dectectors.AddObject(*ctDetectHeat);
    dectectors.AddObject(*ctDetectInfraRed);
    dectectors.Wait( TRUE, INFINITE);

    // done...
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -