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

📄 actobj.cpp

📁 主动对象模式的实现
💻 CPP
字号:
// 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -