본문 바로가기
C.C++/코드

asio 타이머 핸들링 예제

by 겜게준 2018. 4. 17.

#include <iostream>

#include <asio.hpp>

#include <thread>

#include <memory>

#include <vector>

#include <mutex>

#include <chrono>


std::mutex global_stream_lock;


void WorkerThread(std::shared_ptr<asio::io_service> iosvc, int counter)

{

global_stream_lock.lock();

std::cout << "Thread " << counter << "Start.\n";

global_stream_lock.unlock();


while(true){

try{

asio::error_code ec;

iosvc->run(ec);


if(ec)

{

global_stream_lock.lock();

std::cout << "message : " << ec << ".\n";

global_stream_lock.unlock();

}

break;

}

catch (std::exception& e)

{

global_stream_lock.lock();

std::cout << "message " << e.what() << "\n";

global_stream_lock.unlock();

}

}


global_stream_lock.lock();

std::cout << "Thread" << counter << " End.\n";

global_stream_lock.unlock();

}


void TimerHandler(const asio::error_code& ec)

{

if(ec)

{

global_stream_lock.lock();

std::cout << "Error Message: " << ec << "\. \n";

global_stream_lock.unlock();

}

else

{

global_stream_lock.lock();

std::cout << "you have waited for 10 seconds. \n";

std::cout << "now press ENTER to exit. \n";

global_stream_lock.unlock();

}

}




int main(int argc, char ** argv)

{

std::shared_ptr<asio::io_service> io_svc(new asio::io_service);

std::shared_ptr<asio::io_service::work> worker(new asio::io_service::work(*io_svc));


asio::io_service::strand strand(*io_svc);


global_stream_lock.lock();

std::cout << "Thr Program will wait 10 seconds.\n";

global_stream_lock.unlock();


std::vector<std::thread> threadGroup;

for(int i = 1; i <= 5; ++i)

threadGroup.emplace_back(std::bind(&WorkerThread, io_svc, i));



asio::system_timer timer(*io_svc);

timer.expires_from_now(std::chrono::seconds(10));

timer.async_wait(TimerHandler);


std::cin.get();


io_svc->stop();


std::for_each(threadGroup.begin(), threadGroup.end(), [](std::thread& thread){ thread.join(); });


system("pause");

return 0;

}


댓글