2016-10-20 5 views
0

다음 코드를 고려 원인 완료하고 창은 다른 메시지를 수신 할 수 없습니다. 내가 필요한 것은 crossValidate()에 대한 새 스레드를 시작하는 것입니다. 그리고 내가 무슨 짓을했는지 정확히 :C++ WINAPI 버튼 클릭에 새로운 스레드는 치명적인 오류

std::thread crossValidateThread; // global 
// ... 
// ... 

// Inside mainOnCommand() 
// ... 
case IDMC_CROSSVALID: { crossValidateThread = std::thread(crossValidate,hwnd); break; } 
// ... 

이제 프로그램은 동결되지 않았다 그러나 나는이 새로운 문제가 : crossValidate() 마무리가 실행이되면

1), ROC 곡선이 사라지게 표시하는 창 (지난 2 참조 코드 라인 내부 crossValidate())

2) crossValidate()은 처음에만 작동합니다. 내 말은 처음에 버튼 crossValidate()이 실행 (여전히 ROC 창이 사라짐)을 클릭했을 때입니다. 그러나 버튼을 한 번 더 누르면 치명적인 오류가 발생하여 처음 실행됩니다.

+0

디버거에서 프로그램을 실행하는 경우 어떤 결과가 발생합니까? – xaxxon

+0

@ xaxxon 글쎄, vs13을 사용하고 치명적인 오류를 말하는 창이 표시됩니다. – DimChtz

+0

@Someprogrammerdude 예, 사라질 것임을 의미하지는 않습니다. 나는 스레드가'crossValidate()'를 호출하지 않을 때 윈도우가 사라지지 않는다는 것을 의미합니다. – DimChtz

답변

2
crossValidateThread = std::thread(crossValidate,hwnd); 

당신이 가입 또는 분리 시작 있지만 된 표준 : 스레드에 할당하면, 프로그램이 종료됩니다.

처음으로 아직 시작되지 않았으므로 괜찮습니다. 두 번째로 이미 스레드가 있으므로 프로그램이 충돌합니다.

*이 호출 된 관련 스레드 (조인() == TRUE), 표준이 : : 종료()를 한 경우

http://en.cppreference.com/w/cpp/thread/thread/~thread

.

+0

스레드를 분리해야합니까? – DimChtz

+0

@DimChtz 그 중 하나 또는 새 스레드를 만들기 전에 이전에 가입하십시오. –

+0

그것이 완료되었는지 알 필요가 있는지 여부에 달려 있습니다. join()은 끝날 때까지 블록됩니다. N 개의 동시 스레드를 저장해야하는 경우 벡터의 벡터를 만들어야 할 수 있습니다. – xaxxon