Tutorial 1. sync_timer

Programming/Boost asio 2015. 2. 4. 22:58

다음 내용에 기반합니다. 


http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/tutorial/tuttimer1.html


시작하기에 앞서, 환경을 구성한다.

boost windows prebuilt 를 받아 적당한 경로에 준비시켜 두었으며,

그 적당한 경로를 Project > Properties 에서 include header 설정 해두었고, 



마찬가지로 lib 파일의 경로도 잡아준다. 




lib 파일의 경로는 잡아줬지만, 실제 링킹되어야 하는 파일명은 dependencies 에 지정하지 않은 상태다.

직접 링크에러가 날때마다 properties 에 추가하거나, pragma comment 로 소스코드에서 linking 할 수 있는데, 

편의상 소스코드에 넣었다.


sync_timer 소스코드는 다음과 같다. 



첫 튜토리얼 답게 굉장히.. 간단하다.

그냥 asio 의 deadline_timer 를 이용, 생성시 지정한 시간만큼 대기하다 종료하는 프로그램.

deadline_timer 의 wait() 함수는 지정된 시간이 지나기 전까지 리턴되지 않는다.


io_service 라는 생소한 클래스와 deadline_timer 라는 녀석이 있는데, 

deadline_timer 는 그냥 timer 기능을 제공하는 녀석이구나 정도로 쉽게 이해가 갈텐데, 

이 녀석이 사용하는 io_service 라는 클래스가 앞으로도 상당히 자주 보게될 클래스. 

I/O 기능을 제공한다 - 라고 튜토리얼에서는 소개하고 있는데, 단독으로 사용되는 경우는 없고,(아는한) 이 예의 deadline_timer 같은 io_object 와 결합이 되어 사용된다. 


IO_SERVICE 

> io_object 로부터 시작 요청을 받으면 OS 와 io 동작을 제공해주는 클래스. 

sync 의 경우에,

시작함수 (initiating function) 가 호출된 스레드에서 I/O 를 수행한 후 리턴


async 의 경우에, 

io_object 의 시작 함수가 (initiating function) 호출되면 io_object 에 지정된 io_service 가 OS 영역-정확히는 아니지만 이렇게 이해해도 큰 무리가 없다고 boost 개발자가 설명한바있다..(로 들렸다)-에 work 라는 객체와 핸들러를 함께 전달하여 queuing 해뒀다가, io_service.run() 이 호출되면 OS 로 실제로 요청 동작을 실행하고, 

OS 로부터 io_service 로 완료 알림이 오면 io_service 는 생성했던 work 객체와 handler 를 dequeue 하여 핸들러를 호출한다. 


실행결과는 - 지정한 5초동안 아무 반응이없다가 hello world 가 출력되고 프로그램이 종료되는 것이다.





'Programming > Boost asio' 카테고리의 다른 글

Tutorial 5. Synchronising handlers in multithreaded programs  (0) 2015.04.11
Tutorial 4. member function handler  (0) 2015.03.17
Tutorial 3. Binding arguments to a handler  (0) 2015.03.15
Tutorial 2. async_timer  (0) 2015.03.14
0. 소개  (0) 2015.02.02

0. 소개

Programming/Boost asio 2015. 2. 2. 00:22

C++ Third-party 라이브러리 (라기엔 너무 메이저한) Boost 의 부분인 

asio 의 tutorial 을 정리할 예정입니다. 


다음 내용에 기반합니다.


http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/tutorial.html

Basic Skills

The tutorial programs in this first section introduce the fundamental concepts required to use the asio toolkit. Before plunging into the complex world of network programming, these tutorial programs illustrate the basic skills using simple asynchronous timers.

Introduction to Sockets

The tutorial programs in this section show how to use asio to develop simple client and server programs. These tutorial programs are based around the daytime protocol, which supports both TCP and UDP.

The first three tutorial programs implement the daytime protocol using TCP.

The next three tutorial programs implement the daytime protocol using UDP.

The last tutorial program in this section demonstrates how asio allows the TCP and UDP servers to be easily combined into a single program.


Scala.1 기본 문법. Method / if - expression / for - expression

Programming/Scala 2014. 6. 14. 00:41

Scala.1 기본 문법


사족

지금 와서 스칼라 포스팅이라니.

Functional Programming Language 를 사용할 일이 있어서 어떤 언어로 쓸까 하다가 한번이라도 접해봤던 Scala 를 선택했다. 

작년에 공부했던거 같은데 별로 사용을 안하니 엄청난 속도로 pop 이 되서 .. ㅡㅡ;;;; 

정리해뒀으면 좋았겠지... 라고 같은 후회를 이번에도 하며, 

오랜만에 ... 프로그래밍 관련해서 제대로 글을 쓴게 몇년 만인지 회상하며 포스팅!


어쨌거나 기념비적인 새로운 언어와 첫번째 만남이 되는 글인 만큼 외쳐본다.





Method 의 선언

명색이 Functional Programming Language 다. Method 부터! 

- 다음에 다룰테지만, 스칼라는 Method 와 Function 의 (메서드,함수) 개념이 분리되어 있다.  본문에서는 두 개념을 메서드로 통칭한다.


다음과 같이 정의한다. 

def <functionName> (<argument>: <type> ... ) : <returnType> = { <body> }

단, <returnType> 의 경우 deduction 이 가능하므로 생략 가능하다. 


예컨데

def sum (a: Int, b: Int): Int = {

a + b

}


return keyword 는 사용하지 않는 것이 일반적.


인자 / 리턴 타입으로 사용할 수 있는 타입들

Unit(void), Int, Boolean, String, Method ( a : Int => Int , 인트를 받아 인트를 리턴하는 메서드 )


상수 / 변수 

상수는 그나마 나은데, 변수는 가능한한 어쨌거나 사용하지 않는 것이 스칼라의 기본 스타일이었던 것 같다. 

가장 기본이라고 생각할 수 있는 이 문법을 두번째로 소개하는 이유라 하겠다.

선언할 때, 타입명은 적을 수 없다.


val a = 3

var b = 3


if-expression 

우리의 마음속에 있는 그대로 친숙하다.


if (<predicate>) { <then-clauses> } else { <else-clauses> }


brace ( { , } ) 는 다른 언어와 마찬가지로 생략 가능하다. 



for-expressions

일반적인 for

for ( <indexing var> <- <initial value> until <escape condition> ) 

즉, 다음과 같이 사용할 수 있다.


for (i <- 0 until 10) {


}


for-each ( 여기서의 for - each 는 자바에서의 개념이다 )

컬렉션의 요소를 하나씩 방문하는 형태인 for-each 문 


for (<element> <- <collection>) { <body> }


즉 , 다음과 같이 사용할 수 있다.


val array = Array(1, 2, 3)

for ( element <- array )

{

println(element)

}


또, 스칼라에서 자체적으로 foreach 라는 컬렉션의 멤버 메서드가 built-in 으로 존재하는데, 다음과 같다

<collection>.foreach(<Method>)


컬렉션의 각 요소에 대해서 인자로 전달받은 메서드를 적용한다. 


val array = Array(1, 2, 3)

def increment(a: Int){

  a+1

}

array.foreach(increment)


요소는 하나씩 얻어지므로, foreach 의 Method 는 element => Unit 의 형태로 구성되어야 한다.