1

CFProgress라는 창에 기존 진행률 표시 줄을 표시하기 위해 타사 드라이버의 콜백 기능을 사용하는 진행률 표시 줄이 있습니다. 콜백 함수를 사용하는 반응 형 진행률 막대를 코딩하는 방법은 무엇입니까?

void _stdcall ProgressFuncC(CallbackDataType UserData, LongWord Operation, LongWord Progress, LongWord Total, Bool CanStop, Bool *Stop) 
{ 
char cMsg[100]; 
sprintf_s(cMsg, 100, "Task Progress (%d%% completed).", Progress * 100/Total); 
CFProgress *cFM; 
cFM = theApp.m_cFM; 
cFM->m_Prg1.SetPos(Progress * 100/Total); 
cFM->m_lblMsg.SetWindowText(cMsg); 
cFM->UpdateWindow(); 
} 

이전 OS'es에 잘 작동하는 데 사용하지만, 윈도우 7 진행률 표시 줄 창이 표시되는 동안 응용 프로그램이 응답하지 않는 불평 계속해서 다음과 같이

CFProgress *cFM=new CFProgress(); 
theApp.m_cFM = cFM; 
cFM->Create(CFProgress::IDD); 
cFM->ShowWindow(SW_SHOW); 
thirdpartydriver->set_OnProgress(ProgressFuncC, (void *) cFM); 
thirdpartydriver->DoReallyLongTask(); 

ProgressFuncC입니다 . 실제 기능은 영향을받지 않습니다.

이 기능을 Windows에 더 잘 적용하려면 어떻게해야합니까?

는 내가 ProgressFuncC 코드에 이것을 추가하고이 문제를 해결하기 위해 기대, 또는 그냥 여기 혼동하고 있습니다 :

MSG msg; 
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
{ 
    if (msg.message == WM_QUIT) 
    { 
     ::PostMessage(NULL, WM_QUIT, 0, 0L); 
    } 
    else 
    { 
     ::TranslateMessage(&msg); 
     ::DispatchMessage(&msg); 
    } 
} 

답변

2

메인 UI 스레드에서 실행 thirdpartydriver->DoReallyLongTask();인가?

그렇다면 메시지 루프에 제어권을 반환 할 때까지 창에 응답하지 않습니다.

이 루프가 실행되고 있고 긴 태스크가 주 스레드에 있으면이 루프가 차단됩니다.

while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 

당신의 최선의 선택은 thirdpartydriver->DoReallyLongTask(); 별도의 스레드로 이동하고 콜백 함수가 메시지 루프에 메시지를 넣어 가지고 (SendMessage 또는 PostMessage를 통해) 한 다음 해당 메시지를 처리하고 진행률 표시 줄을 업데이트하는 것입니다.

+0

코드에 멀티 스레딩이 없으므로 thirdpartydriver-> DoReallyLongTask()가 기본 UI 스레드에서 실제로 실행됩니다. 그러나 진행 표시 줄을 별도의 스레드에 넣는 것이 더 간단하지 않습니까? – Pranab

+0

더 간단 할 수도 있지만 문제가 해결되지는 않습니다. 응답 성있는 UI를 얻으려면 메시지 루프로 제어를 되돌려 보내야합니다. 그것은 단지 창문이 작동하는 방법입니다. – karoberts

+0

멀티 스레딩을 처음 접했습니다 - "ProgressFuncC 코드에이 코드를 추가 할 수 있습니까?"라는 질문에 약간의 코드를 추가했습니다. 응답이 없으면 해결할 수 있다고 생각합니까? – Pranab

관련 문제