릴리스 구성 (x86 및 x64 모두)으로 컴파일하면 프로그램이 완료되지 않습니다. 명확히하기 위해 빌드 오류나 실행 오류가 없습니다.릴리스 구성에서 다중 스레딩이있는 Visual Studio C++ 런타임 문제
문제의 원인과 해결책을 찾은 후 배열 문제라고 제안하는 Program only crashes as release build -- how to debug?을 발견했습니다. 이 문제가 내 문제를 해결했지만 문제에 대한 통찰력을주었습니다.
문제를 더 혼란스럽게하기 위해 메인 스레드의 서브 루틴의 실행 시간이 약 0ms보다 큰 경우에만 해당됩니다. 여기
코드의 관련 부분은 다음과 같습니다 내 프로그램에 걸리면 문제가되는 라인이 프로그램은 생성 된 스레드를 대기 마지막 문, 종료 할 수 있다는 것입니다// Startup Progress Bar Thread
nPC_Current = 0; // global int
nPC_Max = nPC; // global int (max value nPC_Current will reach)
DWORD myThreadID;
HANDLE progressBarHandle = CreateThread(0, 0, printProgress, &nPC_Current, 0, &myThreadID);
/* Do stuff and time how long it takes (this is what increments nPC_Current) */
// Wait for Progress Bar Thread to Terminate
WaitForSingleObject(progressBarHandle, INFINITE);
:
WaitForSingleObject(progressBarHandle, INFINITE);
그리고 여기가 진행 표시 줄 기능을위한 코드입니다
DWORD WINAPI printProgress(LPVOID lpParameter)
{
int lastProgressPercent = -1; // Only reprint bar when there is a change to display.
// Core Progress Bar Loop
while (nPC_Current <= nPC_Max)
{
// Do stuff to print a text progress bar
}
return 0;
}
W 여기서 'Core'while 루프는 일반적으로 측정 된 서브 루틴의 실행 시간이 약 0ms이면 단일 반복을 얻지 못합니다. 이를 명확히하기 위해 timed 서브 루틴의 실행 시간이 약 0ms이면 printProgressBar가 한 번 실행되기 전에 nPC_Current가 nPC_Max보다 커집니다. 즉, 스레드가 주 스레드가 스레드를 기다리기 전에 종료됩니다.
누구든지이 문제에 도움이되거나 문제에 대한 추가 통찰력을 제공하면 문제를 해결하는 데 큰 어려움이 있습니다.
감사합니다.
편집 :
- 표현은
- 는 내용을 산만을 삭제하고 해명을
Ooooooo! 나는 이것들을 싫어한다! 릴리스 코드는 디버그 코드와는 분명히 다릅니다. 디버그 빌드에서 작동하는 (또는 작동하는 것처럼 보이는) 무언가는 릴리스 빌드에 존재하지 않게 최적화되어 있으며 다르게 초기화되고 다른 코드 경로를 사용하거나 논리적 결함을 드러내는 방식으로 재 조립됩니다. 너를 위해서 느낀다, 재커리.하지만 이런 경우에는 보통 우리가 할 수있는 일이별로 없다. MCVE를 빌드하는 것은 절대 <숨겨진 삭제>가 될 것입니다. 그러나 위쪽에는 대개 버그가 노출되어 재 게시에서 제외됩니다. – user4581301
"내 프로그램을 완료하지 못했습니다"란 의미는 무엇입니까? _Debug_ 모드에서 빌드하면 모든 것이 정상적으로 작동합니까? 실제로 어떤 일이 발생합니까? – CristiFati
시도해 볼만한 한 가지는 오래된 체크 포인트 디버깅입니다. 몇 가지'std :: cerr' 문을 열어서'printProgress'에서 코드가 멈춰있는 곳을 찾으십시오. – user4581301