2011-10-09 2 views
0

내 응용 프로그램에서 나는 요소의 알 수없는 수의 루프를 입력하고하지 다시 그립니다, 그래서 난 그 응용 프로그램이 실행되고 알려내 진행률 표시 줄이 모두 WINAPI

를 진행 표시 줄을 표시하고이 코드가 잘 작동, ,

do 
{      
    ... 
    SendMessage(hPBLoading, PBM_STEPIT, 0, 0);  
    ... 
} while(true); 

을하지만 불행히도 윈도우의 나머지는 분해와 같은 윈도우 내 응용 프로그램을 치료 몇 초 후 및 Windows 7에 (때문에 루프에 분명하다) 새로 고침하지 않습니다 PROGRES 바 independly 상쾌한 루프를 끝내고 다시 새로 고침하면

그래서 내가 메시지 큐를 파견 할 필요가 있다고 생각하고 나는이 내 코드를 변경 : 그것은 잘 작동

do 
{      
    ... 
    SendMessage(hPBLoading, PBM_STEPIT, 0, 0);  
    ... 
    us_tmpBreakCounter++; 
    ... 

    if (us_tmpBreakCounter >= 10) 
    {  
     us_tmpBreakCounter = 0;  
     UpdateSomeOtherElementsinWindow(); 

    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) == TRUE) 
     { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     } 
    } 
} while(true); 

의 applcation 업데이트 및 전 후 새로 고쳐집니다. 10 카운트 그래서 그것의, 을 분해하지하지만 불행히도 또 다른 문제는 현재 진행 표시 줄이 완전히 다시 그리기하지 않습니다 발생 - 몇 초 후 경 사진 프레임 사라져은 아래 이미지를 확인 : 대한

http://mstanisz.website.pl/temp/progressbar_01.jpg

감사합니다 당신의 도움! m.

+0

두려운 DoEvents()를 다시 발명했습니다. PM_QS_PAINT를 PeekMessage에 전달하여 피해를 제한하십시오. –

+0

고마움, 나는이 영혼을 너무 점검 할 것이다 ... – Mateusz

답변

3

GUI 스레드를 사용하여 긴 작업을 수행하는 것처럼 보입니다. 그건 좋은 습관이 아니야. 긴 작업을 수행하려면 작업자 스레드를 사용하고 작업자가 작업하는 동안 GUI 스레드가 GUI를 처리하게하십시오. 두 개의 스레드 (GUI가 닫히면 작업자를 중지시키고 현재 작업이 끝나기 전에 작업을 시작하는 것을 피하는 등)를 동기화하는 작업을 추가로해야합니다.하지만 그것이 작동하는 방식입니다.

+0

고마워, 나는이 여분의 실을 피할 수 있기를 바랐다. 그러나 나는 그것을 처리 할 필요가있는 것처럼 보인다. 어쩌면 코드 예제일까요? 간단한 스레드를 만들거나 특정 스레드를 만들어야합니까? – Mateusz

+0

필자의 코딩 환경에 따라 쓰레드를 만들 것입니다. 순수 Win32에서는'CreateThread', C/C++에서는'_beginthreadex', MFC 등에서는'AfxBeginThread' 또는'CWinThread'입니다. 동기화는 간단하지 않습니다. 어쨌든 좋은 지식을 필요로하므로 그러한 종류의 작업에 익숙하지 않은 경우 - 기회를 활용하십시오! – eran

+0

고마워, 난 그냥 작업자 스레드를 추가 완료, 쉬운 끝 효율, 잘 작동 ... – Mateusz

관련 문제