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);
}
}
코드에 멀티 스레딩이 없으므로 thirdpartydriver-> DoReallyLongTask()가 기본 UI 스레드에서 실제로 실행됩니다. 그러나 진행 표시 줄을 별도의 스레드에 넣는 것이 더 간단하지 않습니까? – Pranab
더 간단 할 수도 있지만 문제가 해결되지는 않습니다. 응답 성있는 UI를 얻으려면 메시지 루프로 제어를 되돌려 보내야합니다. 그것은 단지 창문이 작동하는 방법입니다. – karoberts
멀티 스레딩을 처음 접했습니다 - "ProgressFuncC 코드에이 코드를 추가 할 수 있습니까?"라는 질문에 약간의 코드를 추가했습니다. 응답이 없으면 해결할 수 있다고 생각합니까? – Pranab