📄 actobj.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 + -