firealarm.cpp

来自「window下的多线程编程参考书。值得一读」· C++ 代码 · 共 124 行

CPP
124
字号
#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 + =
减小字号Ctrl + -
显示快捷键?