Windows 구현 중 진행률이 높은 진행 표시 줄을 큰 숫자의 바이트로 표시하지만 올바르게 수행 할 수는 없습니다.Progressbar 범위와 위치, C++에서 큰 숫자를 처리하는 방법은 무엇입니까?
다음과 같이하면 2.5GB의 다운로드가 가능하며 다운로드가 완료되면 전체 범위를 벗어납니다.
double dlBytes = bytesDownloaded();
unsigned int newIncrement = (unsigned int)(dlBytes/3000);
SendMessage(hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0);
이 매우 noobish 구현하고, 나는 XY 상황에서 가을을 원하지 않는, 그래서 내 질문은 무엇인가 : 다음
double dlSize = getDlSize();
unsigned int pbRange = (unsigned int)(dlSize/3000);
SendMessage(hProgressbar, PBM_SETRANGE, 0, MAKELPARAM(0, pbRange));
및 각 다운로드 콜백에서 새로운 위치를 설정 바이트 수 2-5GB의 큰 숫자로 진행률 막대를 구현하는 올바른 방법은 무엇입니까?
나는 시도 모두 계정에서 ProgressBar의 폭을 고려하여 대신 실제 수의 비율을 사용하여, 심지어 모두 결합 @msandiford 및 @NikBougalis 아래 제안 된 접근 방법,하지만 모든 경우에 newIncrement 항상 0이 나온다. 아마도 dlSize가 항상 낮기 때문이다. (double newIncrement는 1.15743e + 007과 같은 것으로 나오고, 0과 그것을 캐스팅한다.)
내가 뭘 할 수 있습니까?
새로운 코드가 결합하는 두 가지 접근 방식 :
편집 2 : 그 지금 작업처럼 추가 된 몇 가지 검사를 코드에 내가 지속적으로 newIncrement 0을 받고되면서, 확실하지 않은 모양을 잘 :
GetClientRect(hProgressbar, &pbRCClient);
pbWidth = pbRCClient.right - pbRCClient.left; // (pbWidth its a global variable)
unsigned int pbRange = pbRCClient.right - pbRCClient.left;
SendMessage(hProgressbar, PBM_SETRANGE, 0, MAKELPARAM(0, pbRange));
및 업데이트하는 동안 :
double dlSize = getDlSize();
double doubleIncrement = ((dlSize * pbWidth)/totalSize);
unsigned int newIncrement;
if ((unsigned int)doubleIncrement < 1)
{
blockFill += doubleIncrement;
if ((unsigned int)blockFill > 1)
{
newIncrement = (unsigned int)blockFill;
SendMessage(hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0);
blockFill = 0;
}
}
else
{
newIncrement = (unsigned int)(doubleIncrement);
SendMessage(hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0);
//blockFill = 0;
}
편집 3 : 그것은 아직 초기 마무리처럼 보인다.
'PBM_DELTAPOS'보다는'PBM_SETPOS'를 사용하는 것이 훨씬 쉽습니다. 나는 또한 내 대답에 버그가있어서 잘못된 방향으로 인도하고 있을지도 모른다. ( – msandiford
@msandiford PBM_SETPOS는 진행 막대 위치를 WPARAM을 통해 제공된 위치로 재설정한다 :) – StudentX
그래, 맞아. 정확한 델타를 계산하는 것보다 진행 막대의 절대 위치를 계산하는 것이 훨씬 쉽습니다. 다운로드 한 총 데이터 양을 추적하면됩니다. – msandiford