728x90
반응형

Program Language 197

[C++] atomic

std::atomic은 원자성을 보존해주기 위해 사용된다. 다시 말하자면 mutex 없이 두 개의 스레드가 동시에 접근해도 data race 문제가 발생하지 않는다. 또한 std::atomic을 기록하는 라인이 수행될 때는 이전에 나타난 라인들이 수행되어서는 안 된다. std::atomic은 복사와 이동 연산을 지원하지 않는다. 원자성을 보존해야 하기 때문이다. 다행히 복사하는 방법은 있다. atd::atomic y(x.load()); y.store(x.load()); mutex를 통한 전역 변수 동기화에서는 dead lock에 빠질 수 있다. 그래서 atomic을 이용하여 lock, unlock을 사용하지 않고 값을 증가시키거나 감소시킬 수 있는 기능이 C++11부터 제공되고 있다. atomic : a..

[C++] thread에서 return 값 받기 (promise/future)

C++11 이후에는 이 추가되었으며 future, promise를 통해서 값이나 예외를 저장할 수 있다. 생성하려는 Thread에 Promise를 매개변수로 전달해서 받아올 수 있다. 미래에(future) thread가 원하는 데이터를 돌려 주겠다고 약속(promise)하는 것이라고 할 수 있다. #include #include #include #include void ThreadFunc(std::promise& retVal) { retVal.set_value(1); } int main() { std::promise p; std::future f = p.get_future(); std::thread th1(ThreadFunc, std::ref(p)); th1.join(); std::cout

[MFC] App 혹은 Dll에서 콘솔 사용하기

DEBUG 모드에서 콘솔을 사용하면 LOG를 실시간으로 확인할 수 있기 때문에 편리하다. Dll이나 Application에서 콘솔을 사용하는 방법은 두 가지다. 첫 번째는 서브시스템으로 콘솔을 링크를 하는 것이다. #pragma comment(linker, "/subsystem:console") 해당 코드를 기입하면 콘솔 프로그램에서 사용할 수 있는 cout 등을 이용할 수 있다. 두 번째는 AllocConsole() 함수를 이용하는 것이다. AllocConsole() 함수를 실행한 후에는 WriteConsole() 함수로 콘솔에 텍스트를 적을 수 있다. 편리하게 사용하기 위해서 sprintf처럼 만들어 사용할 수 있다. #define dp(fmt,...) topeng::dbg_print( fmt, __..

[MFC] 시스템 메뉴 삭제

Application에서 시스템 메뉴를 삭제하는 방법은 가장 쉽게는 아래와 같다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~WS_SYSMENU; // 시스템 메뉴 삭제 return TRUE; } 윈도우 스타일에서 SYSMENU를 제거하는 방법이다. 이것은 메뉴 및 버튼 그리고 아이콘까지 모두 삭제하기 때문에 디자인 면에서 좋지 않다. GetSystemMenu(FALSE)->EnableMen..

[MFC] Frame 크기 고정하기

MFC에서 Frame 크기를 고정하기 위해서는 CMainFrame 클래스의 ON_WM_GETMINMAXINFO 메시지를 사용해야 한다. ON_WM_GETMINMAXINFO메시지를 추가하면 OnGetMinMaxInfo 함수가 생성된다. void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { lpMMI->ptMinTrackSize.x = 프레임 너비; lpMMI->ptMinTrackSize.y = 프레임 높이; lpMMI->ptMaxSize.x = 프레임 너비; lpMMI->ptMaxSize.y = 프레임 높이; CFrameWnd::OnGetMinMaxInfo(lpMMI); } 과 같이 작성하면 된다. 프레임을 화면 크기로 유지하려면 PreCreateWindow()에..

[JS] POST 방식으로 데이터 전송

데이터 전송 시에는 태그를 이용하는 것이 가장 편리하지만, 여의치 않은 경우 JavaScript로 데이터를 전송해야 한다. JavaScript로 데이터를 전송할 때, 여기저기서 정형화된 틀이 있었는데, 이를 활용했다. 데이터를 전송할 때에는 아래와 같이 전송하면 된다. sendPost(URL 경로, { 데이터명: 데이터 }); Javascript는 CLIENT 언어이기 때문에 POST로 보낸 데이터를 받지 못한다. 그러므로 POST로 보낸 데이터를 받으려면 JSP나 PHP로 받아야 하는데, PHP로 받는 방법은 아래와 같다. sendPost('detail_action.php', { param: 'test1' }); 위와 같은 방법으로 데이터를 전송하게 되면 PHP에서 다음과 같이 받으면 된다.

[HTML] 이미지 가운데 정렬하기

※ HTML 예제는 주석 처리를 하지 않으니, 블로그 자체가 깨져버리는 기현상이 생긴다. 사용할 때는 주석을 제외하고 사용하자. 1. CENTER 태그 이용하기 되도록 사용하지 않도록 하자. (HTML5에서 지원하지 않음) 2. DIV 태그 이용하기 text-align 속성 값을 지정하여 사용한다. 3. Style 태그 이용하기 img 태그를 이용할 시 가운데에 오도록 지정할 수 있다. 4. CSS 파일 이용하기 CSS파일에 지정된 스타일을 만든 후, HTML에서 해당 스타일을 가져다 쓴다. #cen_img { display:block; margin:auto; } link 태그를 이용하여 css 파일을 연결한 후, cen_img 스타일을 적용시킬 태그에 id를 지정해 준다. 위의 세 방법 모두 이미지를 ..

[Python] MySQL 사용하기

pymysql 라이브러리 설치 파이썬 코드에서 MySQL을 사용하기 위해서는 pymysql이라는 라이브러리를 설치해야 한다. 아래와 같은 명령을 콘솔 창에 입력하면 설치가 가능하다. pip install pymysaql 만약에 pip 명령어를 찾을 수 없다면 install 시에 환경 변수를 등록하지 않았기 때문이다. python3.8의 경우는 아래와 같다. C:\Users\계정\AppData\Local\Programs\Python\Python38 C:\Users\계정\AppData\Local\Programs\Python\Python38\Scripts 환경 변수에 아래와 같은 경로를 추가하면 된다. Python을 사용한 MySQL DB에 데이터 추가하기 MySQL WorkBench등을 이용하여 Databa..

[Python] 캔버스 사용하기

Tk()로 생성한 윈도 창에는 선, 면, 글자 등의 그림을 그릴 수 없다. 그래서 캔버스를 윈도 창에 만든 후 선, 면, 글자 등을 표현한다. from tkinter import * from tkinter.simpledialog import * window = Tk() canvas = Canvas(window, height=300, width=300) # 캔버스를 윈도 창에 부착 canvas.pack() canvas.create_line([0,0], [70,70], [30,170], fill="blue", width=3) canvas.create_polygon([[100,100], [100,150], [150,150], [150,100]], fill="red") canvas.create_text([200..

[Python] 대화상자 사용하기

파이썬은 몇 가지 대화 상자를 제공한다. 숫자나 문자를 입력은 simpledialog를 임포트 하면 손쉽게 사용할 수 있다. from tkinter import * from tkinter.simpledialog import * window = Tk(); window.geometry("400x100") label1 = Label(window, text="입력된 값") label1.pack() value = askinteger("확대배수", "주사위 숫자(1~6)을 입력하세요", minvalue=1, maxvalue=6) label1.configure(text=str(value)) window.mainloop() askinteger는 정수 입력을 받는 함수이다. 실수라면 askfloat, 문자열라면 asks..

[Python] 메뉴 만들기

응용프로그램을 만들기 위해서 메뉴의 사용은 필요한 부분이다. 기본 윈도 창에 메뉴를 추가해 보도록 한다. from tkinter import * window = Tk() mainMenu = Menu(window) window.config(menu=mainMenu) #메뉴에 "파일"을 추가하고 구성원으로 열기와 종료 메뉴를 만든다. #둘은 SEPARATOR로 구분되어 진다. fileMenu = Menu(mainMenu) mainMenu.add_cascade(label="파일", menu=fileMenu) fileMenu.add_command(label="열기") fileMenu.add_separator() fileMenu.add_command(label="종료") window.mainloop() 메뉴를 만..

[Python] 프레임, 에디터박스, 리스트박스 만들기

프레임은 화면의 구역을 나누는 것이고, 에디터 박스는 입력 상자, 리스트 박스는 목록 표현에 사용된다. 샘플 코드를 살펴보면 아래와 같다. from tkinter import * window = Tk() window.geometry("200x200") #상단/하단 프레임 작성 upFrame = Frame(window) upFrame.pack() downFrame = Frame(window) downFrame.pack() #에디터 박스 editBox = Entry(upFrame, width = 10, bg = 'green') editBox.pack(padx = 20, pady = 20) #리스트박스 listbox = Listbox(downFrame, bg = 'yellow') listbox.pack() l..

[Python] 윈도우 띄우고 라벨, 버튼 만들기

Phython에서 Window 창을 띄우려면 tkinter 가 필요한데, 우분투에서는 띄워지지 않는 것 같다. Windows에서도 Phython IDLE에서만 작동을 한다. 윈도를 띄우는 것은 아내와 같다. from tkinter import * window = Tk() window.title("윈도우창 연습") # 윈도우 캡션 지정 window.geometry("400x100") # 윈도우 크기 지정 window.resizable(width=FALSE, height=FALSE) # 윈도우 크기 변경 금지 window.mainloop() 라벨을 추가해보자. from tkinter import * window = Tk() window.title("윈도우창 연습") window.geometry("400x10..

[C++] 명시적 링크 (Explcit Linking) 시 GetProcAddress NULL 반환

아래는 mdsn에서 제공하는 dynamic linking 예제이다. 평소에 아무 생각없이 잘 사용하다가 갑자기 GetProcAddress에서 계속해서 NULL이 Return 된다. ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 함수이름도 매개변수 형식도 모두 맞지만 계속해서 NULL이 반환 되었다. 그래서 이것저것 테스트해 본결과 namespace 안에 있는 함수를 가져 오지 못하는 것이었다. 그럼, 함수 이름 앞에 네임스페이스::함수 이렇게 하면 동작할려나.. @_@ 왜 당연히 읽어 올거라고 생각한걸까.. 네임스페이스 안은 완전 다른 세상인데... // A simple program that uses LoadLibrary and // GetProcAd..

[Win32] <xmllite.h> 사용 시 redefinition Error 발생 시

XML 파일을 읽어오는 프로그램을 작성하다가 이전 프로젝트에서는 문제가 없었는데, 새로 만들려고 하는 프로젝트에서 계속 redifintion 관련 에러가 마구 쏟아져서 열받고 있었는데.. 가 필요한 것을 알게 되었다. 이것은 CString을 사용하게 해주는 헤드 파일인데.. 가 CString을 사용하는 것 같다. 우선 클리어.

728x90
반응형