actobj.cpp

来自「主动对象模式的实现」· C++ 代码 · 共 101 行

CPP
101
字号
// ActObj.cpp
//
#include <iostream>
#include "ActObj.h"

void MethodRequest::call()
{
    ReceiverImpl::activeOperation(this->getID());
}

void ActivationQueue::enqueue(MethodRequest &request)
{
    Lock lock(_mutex);
    _msgQueue.push(request);
    _event.GreenLight();
}

MethodRequest ActivationQueue::dequeue()
{
    _event.Wait();
    Lock lock(_mutex);
    MethodRequest request = _msgQueue.front();
    _msgQueue.pop();
    if (_msgQueue.size() == 0)
    {
        _event.RedLight();
    }
    return request;
}

Scheduler::Scheduler(ActivationQueue *requestQueue)
:_requestQueue(requestQueue)
#pragma warning(disable: 4355) // 'this' used before initialized
,_controller(_controlEntry, this)
#pragma warning(default: 4355)
{
    _controller.Resume();
}

void Scheduler::_run()
{
    for(;;)
    {
        MethodRequest request = _requestQueue->dequeue();
        request.call();
    }
}

DWORD WINAPI Scheduler::_controlEntry(void *arg)
{
    srand(GetTickCount());
    Scheduler * active = (Scheduler *)arg;
    active->_run();
    return 0;
}

Mutex ReceiverImpl::coutMutex;

void ReceiverImpl::activeOperation(int id)
{
    {
        Lock lock(coutMutex);
        cout << "Finished processing method Request id is " << id << endl;
    }
    double elapse = rand()*100/RAND_MAX;
    Sleep((long)elapse);
    {
        Lock lock(coutMutex);
        cout << "Elapsed time is " << elapse << endl;
    }
}

void RemoteProxy::activeOperation()
{
    _activeQueue->enqueue(*_request);
}

ActivationQueue requestQueue;
Scheduler scheduler(&requestQueue);

ActivationQueue *RemoteProxy::_activeQueue = &requestQueue;

int main(int argc, char const* argv[])
{
    int const REQUEST_NUM = 100;
    
    for (int i=0; i<REQUEST_NUM; i++)
    {
        RemoteProxy proxy(i+1);
        {
            Lock coutLock(ReceiverImpl::coutMutex);
            cout << "Method Request " << proxy.getID() << " is putting in the queue waiting for process." << endl;
        }
        proxy.activeOperation();
    }

    Sleep(8000);
	return 0;
}

⌨️ 快捷键说明

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