반응형

전체 글 231

폴(Poll) 방식의 네트워크 처리 구현

폴(Poll) 방식의 네트워크 처리란 쉽게 말하여 주기적으로 소켓에 데이터가 왔는지를 체크하고 처리하는 방식입니다. 보통 처리 방식을 슈도 코드로 나타내면 아래와 같을 것입니다. while(true) { bool data_recieved = 소켓에 받은 데이터가 있는지 체크(); if (data_recieved) { 소켓 데이터 처리(); } 소켓처리 외의 로직(); } 이런 방식을 사용하는 이유는 네트워크 처리 외의 로직을 네트워크 처리 쓰레드에서 함께 하기 위함입니다. 물론 이런 폴(Poll) 방식를 사용하지 않고 네트워크 처리 쓰레드와 네트워크 처리 외의 로직 쓰레드를 분리하여 처리하고 양쪽 쓰레드들에서 사용하는 공유 객체와 같은 경우 동기화 처리를 할 수도 있습니다. 이런 폴(Poll) 방식을 이..

C/C++ __FUNCTION__, __FILE__의 유니코드 버전

유니코드를 출력하는 wcout이나 유니코드를 인자로 요구하는 함수와 같은 경우 __FUNCTION__, __FILE__이 제대로 출력되지 않습니다. 구글링 해보면 #define을 이용하여 새롭게 정의하여 출력하는 방식이 나와 있습니다. 처음에는 그렇게 사용했는데 비주얼스튜디오와 같은 경우(현재 2019 이용) 해당 __FUNCTION__, __FILE__의 유니코드 버전인 __FUNCTIONW__, __FILEW__을 corecrt.h에서 정의하고 있었습니다. 어느 버전부터 지원하는 지는 모르겠지만 최신 비주얼 스튜디오를 사용하신다면 그냥 __FUNCTION__, __FILE__을 유니코드로 사용하여야 한다면 __FUNCTIONW__, __FILEW__을 사용하시면 됩니다.

C++ 프로그래밍 2021.11.01

C++ invoke_result: return type 알아내기

invoke_result는 C++ 17부터 추가된 함수의 리턴 타입을 알아내는데 사용되는 함수 입니다. 기존에는 C++ 11에 추가된 result_of가 사용되었는데 C++ 20에서 삭제된 관계로 더 이상 result_of는 사용할 수 없습니다. 해당 함수는 템플릿을 프로그래밍을 할 때 사용할 수 있는 함수인 관계로 일반적인 프로그래밍에는 별로 사용되지 않을 듯 보입니다. 사용법은 invoke_result::type 입니다. 비주얼 스튜디오에서 제대로된 인자를 넣지 않을 경우 인텔리센스에서 멤버로 type이 나오지 않습니다. 아래 예제는 std::result_of, std::invoke_result(https://en.cppreference.com/w/cpp/types/result_of)을 응용하여 작성..

C++ 프로그래밍 2021.10.31

C++ static_assert

C++ 11에 추가된 것으로 기존 assert이 실행 시간에 오류를 검증하는데 비하여 static_assert은 컴파일 타임에 오류를 검증합니다. static_assert은 컴파일 타임에 오류를 검증할 수 없는 변수 값을 대입하는 경우 상수 값이 있어야 한다는 오류를 냅니다. 이런 특성을 가진 관계로 주로 템플릿 프로그래밍에서 타입 체크 등에서 사용됩니다. 비주얼 스튜디오에서는 코드 작성 중에 static_assert이 false일 경우 표시를 해주어서 편합니다. 사용 예는 아래와 같습니다. static_assert(1

C++ 프로그래밍 2021.10.30

Unity 스크립트 수정 후 스크립트 관련 대화상자 뜨는 시간 줄이기

Unity 스크립트를 비주얼 스튜디오에서 수정 및 저장 후 Unity로 돌아오면 Reload Script... 혹은 Hold... 와 같은 타이틀을 가진 스크립트 관련 대화상자가 뜨면서 기다리게 됩니다. 비주얼 스튜디오에서 수정 및 저장한 후에 솔루션 빌드를 하고 Unity로 돌아오면 해당 대화상자가 뜨지 않거나 상대적으로 짧은 시간 뜨는 것을 확인할 수 있습니다. 솔루션 빌드 시간은 Unity가 변경된 스크립트 관련 처리를 하는 시간에 비하여 상대적으로 적은 시간 만을 필요로 합니다. 작은 팁이지만 해당 방법은 실제적으로 개발 시간을 많이 줄여줄 수 있습니다.

error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다.

가변 인자를 받는 함수에서 가변 인자들을 가변 인자를 받는 다른 함수를 호출할 때 ...를 생략할 때 발생할 수 있습니다. 에러가 발생하는 아래 예제 코드를 살펴보겠습니다. template void thread_log_t(const std::wstring fmt, arguments ... args) { wstring str = format_string(L"thread[%d]: ", std::this_thread::get_id()); str += format_string(fmt, args ...); str += wend_line; wcout args ... 와 같이 가변 인자를 제대로 넘기면 에러가 해결됩니다. 가변 인자를 넘기기 위하여 ...가 추가되었다는 것에 주의바랍니다. 해당 에러가 수정된 코드 예..

C++ 프로그래밍 2021.10.28

boost asio io_service(io_context)의 poll과 run의 활용

boost asio io_service(io_context)를 통하여 이벤트를 호출하는 방식은 크게 poll과 run으로 나눈다고 할 수 있습니다. 간단히 두 방식을 살펴보면 아래와 같습니다. poll은 이름 그대로 poll방식으로 이전 poll 호출 후 쌓인 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽에 넘깁니다. run은 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽으로 넘기지 않고 다음 이벤트를 기다립니다. poll로 run을 구현한다고 한다면 아마 아래와 같은 코드가 될 것입니다. while(true) { poll(); } 서버에 연결하는 클라이언트에서 사용된다면 아마도 poll이 좋은 선택이 될 것입니다. 문제는 서버와 같은 경우는 이 두가지 중 어느 방식을 사용할지는 서..

boost asio io_service(io_context)의 이해 및 활용

boost asio에서 io_service(io_context)는 객체의 이벤트 처리를 담당합니다. 이 객체는 좀 더 자세히 보면 실제적으로 socket과 바인드 되어 socket의 이벤트 처리를 담당합니다. 이 객체는 OS kqueue, /dev/poo/, epoll, iocp와 같은 비동기 socket IO나 select와 같은 동기 IO를 해당 객체를 호출한 쓰레드에서 이벤트를 처리하도록 직렬화합니다. 이를 활용하는 방법을 살펴보겠습니다. io_service(io_context)는 socket에 바인드 되는 관계로 socket 이벤트 처리 그룹을 만들 수 있습니다. io_service1(io_context)에는 socket1, socket2를 바인드하고 io_service2(io_context)에는..

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

Unity 정적(Static)객체를 전역 변수처럼 활용하기

개인적으로 사용하는 정적 클래스의 예는 아래와 같습니다. public static class Global { public static bool IsDev { get { #if DEV return true; #else return false; #endif } } public static NextStageMode ModeForNextStage { get; set; } public static int Stage { get; private set; } = 1; public static bool IsBossStage { get { return (Stage % 10 == 0); } } } 이 객체는 예로 유니티 어느 곳에서나 Global.IsDev와 같이 사용할 수 있습니다. 정적 객체는 씬과 함께 로드되고 삭제되..

Unity 싱글톤(Singleton)의 이해

Unity에서의 싱글톤은 일반적인 C#에서의 코드와는 다르며 일반적인 코드는 아래와 같습니다. public class Settings : MonoBehaviour { private static Settings inst_ = null; public static Settings Inst { get { return inst_; } } private void Awake() { if (inst_ == null) { inst_ = this; DontDestroyOnLoad(gameObject); } else { if (inst_ != this) { Destroy(gameObject); } } } } 위의 코드에서 보면 알 수 있듯이 처음 인스턴스를 만들 때는 gameObject에 대해서 DontDestroyOnLo..

반응형