2016-07-13 2 views
-2

작업 환경 만들기 : 내가 VS 2015 년에 있어요C++ 새로운 주제의 콘솔에서 새 창 (Win32에서)

하고는 Win32 콘솔.

개요 :

내가 콘솔에 완료 할 수없는 기능을 수행하는 작업자 스레드의 역할을하도록 새 창을 만드는 오전.

새 창을 만들고 작업을 완료하는 코드가 잘 작동합니다. 그러나 그것은 콘솔을 고정시킵니다.

콘솔이 정지되어있는 동안 콘솔에서 스레드를 만들고 작업을 완료하는 코드가 있습니다. 이것은 또한 잘 작동합니다.

문제 :

내가 코드의 두 가지를 결합 할 수없는 나는, 나는 그것이 콘솔을 차단하지 않도록 스레드에서 새 창을 실행합니다.

코드 :

=============== INT 주요 =================== ===

시작 스레드

x = 0; 
hPrintMutex = CreateMutex(NULL, false, NULL); 

HANDLE hThread1 = (HANDLE)_beginthread(printNumber, 0, &x); 
WaitForSingleObject(hThread1, INFINITE); 

확인 새 창

WNDCLASSEX wndclass = { sizeof(WNDCLASSEX), CS_DBLCLKS, WindowProcedure, 
0, 0, GetModuleHandle(0), LoadIcon(0,IDI_APPLICATION), 
LoadCursor(0,IDC_ARROW), HBRUSH(COLOR_WINDOW + 1), 
0, myclass, LoadIcon(0,IDI_APPLICATION) }; 

if (RegisterClassEx(&wndclass)) 
{ 
    HWND window = CreateWindowEx(0, myclass, "title", 
     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
     CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0); 
    if (window) 
    { 
     ShowWindow(window, SW_SHOWDEFAULT); 
     MSG msg; 
     while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); 
    } 
} 

= ======= 메인 외부 =========================

코드는 새로운 스레드에서 뭔가를

새 창을 만들 수

void printNumber(void* pInt) 
{ 

int* xp = (int*)pInt; 
while (*xp<100) 
{ 
    WaitForSingleObject(hPrintMutex, INFINITE); 

    ++*xp; 
    cout << *xp << endl; 

    ReleaseMutex(hPrintMutex); 
    Sleep(10); 
} 


} 

코드 (* 실제 내용은, 그들이 삭제하고 창 코드 *로 대체됩니다 단지 예입니다) 할 일

long __stdcall WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp) 
{ 
switch (msg) 
{ 

case something: { 

} 
default: 

    return DefWindowProc(window, msg, wp, lp); 
} 
} 

의견이 있으십니까? 감사.

***** 솔루션 *****

내 게시 된 솔루션은 아래의 테스트 작업을 참조하십시오. 이 작업을 얻었다


+0

콘솔과의 상호 작용을 차단하지 않으려면 다른 스레드를 사용하여 창을 만들어야합니다. –

+2

스레드를 만들고 기다리는 것을 차단합니다. 당신의 스레드의 포인트는 무엇입니까? 창은 주 스레드에서 생성 된 것으로 보입니다. 용어 창과 스레드는 상호 교환 가능하지만 사용하지는 않습니다. –

+2

스레드 핸들을 대기 한 직후에 스레드를 시작하면 복잡한 다중 스레드 구현이됩니다. 이는 다중 스레드 (동기화)의 단점이 없지만 이점 (동시성)도 없습니다. 아직 멀티 스레딩에 들어갈만큼 알지 못하는 것 같습니다. 당신은 그 주제에 관해 2 권의 훌륭한 책을 얻을 필요가 있습니다. 게다가,'_beginthread'의 리턴 값을 기다리는 것은 안전하지 않습니다. 그것은 당신 것이 아닙니다. 핸들의 소유권을 얻으려면 대신'_beingthreadex'를 호출하십시오. – IInspectable

답변

1

는, 나는 또한 밖으로 시작하고 다른 사람들과 가진 어려움

에서

을 도와 게시 것이라고 생각 메인 콘솔 경우 스레드

HANDLE myhandle; 

myhandle = (HANDLE)_beginthreadex(0, 0, &mythread, 0, 0, 0); 

시작 루프에서 실행되면 WaitForSingleObject를 호출 할 필요가 없습니다. 콘솔을 닫지 않도록 호출해야하는 경우 WaitForSingleObject를 호출 할 필요가 없습니다.주요

외부

,

unsigned int __stdcall mythread(void* data) 
{ 

cout << "/n created monitor window /n"; 

const char* const myclass = "myclass"; 

WNDCLASSEX wndclass = { sizeof(WNDCLASSEX), CS_DBLCLKS, WindowProcedure, 
    0, 0, GetModuleHandle(0), LoadIcon(0,IDI_APPLICATION), 
    LoadCursor(0,IDC_ARROW), HBRUSH(COLOR_WINDOW + 1), 
    0, myclass, LoadIcon(0,IDI_APPLICATION) }; 

if (RegisterClassEx(&wndclass)) 
{ 
    HWND window = CreateWindowEx(0, myclass, "title", 
     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
     CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, GetModuleHandle(0), 0); 
    if (window) 
    { 
     ShowWindow(window, SW_SHOWDEFAULT); 
     MSG msg; 
     while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); 
    } 
} 

return 0; 
} 

또한 창 주 밖에 새 창을 스레드를 생성하고 스레드 내부에서 당신이 만듭니다

long __stdcall WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp) 
{ 
switch (msg) 
{ 

case checksomethinghere: { 

} 
default: // fall thru 

    return DefWindowProc(window, msg, wp, lp); 
} 
} 

이제 콘솔과 함께 모니터 창을 사용할 수 있습니다. 콘솔 활동을 차단하지 않고

테스트를 거쳤으며 잘 작동합니다.

콘솔을 닫으면 스레드와 만든 창을 종료하므로 내가 작성한 스레드에 대해 CloseHandle을 호출하는 것에 대해 걱정할 필요가 없습니다.

내 시나리오에서는 콘솔 앱이 실행되는 동안 창과 스레드가 계속 작동합니다.