我想弄清楚如何計算當前下載速度,同時下載許多文件的文件夾(它不是一個單一的文件,我正在下載)。而且我無法正確地做到這一點,現在經歷了好幾個小時,它變得太混亂了。下載速度有時會變得太高,有時它的0.在curl和C++中測量下載速度。我做得對嗎?
我正在使用curl和c + +。
在我的下載功能中,程序遞歸地下載每個文件,直到所有的文件都被下載。
這是我設置捲曲如何下載過程中調用TraceProgress功能:
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, TraceProgress);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &response);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
這裏是剩餘代碼:
double totalDownloadableSize = 0; // total size of the download, set prior to starting download of the first file
double downloadedSizeTillNow = 0; // total size downloaded till now - keep adding file size that just completed downloading
double currentDownloadingSize = 0; // size that we are downloading - downloadedSizeTillNow + bytes downloaded of the current file (in TraceProgress Function)
double oldDownloadNow = 0; // size of the old download bytes of that particular file
string fileDownloading = "";
string tempFileDownloading = "";
time_t startSeconds;
time_t oldSeconds;
int downloadIterationCounter = 0;
int TraceProgress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
// add size downloaded till now of this file to the total size downloaded till now
currentDownloadingSize = downloadedSizeTillNow + dlnow;
double rem = ((totalDownloadableSize - currentDownloadingSize)/1024)/1024;
// get current time in seconds
time_t currentSeconds = time (NULL);
// get elapsed time since last itiration
time_t secondsElapsedSinceLastItiration = currentSeconds - oldSeconds;
double downloadSinceLastIteration;
if (oldDownloadNow < dlnow)// so that we don't get wrong data when download file changes
{
downloadSinceLastIteration = dlnow - oldDownloadNow;
}
else
{
downloadSinceLastIteration = dlnow;
}
// calculate current download speed : (dlnow - oldNow)/(current time - oldTime)
double currentDownloadSpeed = downloadSinceLastIteration/(double)secondsElapsedSinceLastItiration;
// if downloading file name is not same as it was in the last call to this function
// change the display text and save the name in the temp. This approach will avoid unnecessory
// text change calls.
if (fileDownloading.compare(tempFileDownloading) != 0)
{
tempFileDownloading = fileDownloading;
string dlfilename = "Downloading: " + fileDownloading;
SetWindowText(hDownloadingSTATIC, dlfilename.c_str());// set text to static control
}
if (downloadIterationCounter == 4)
{
std::ostringstream strs_dn;
strs_dn << (unsigned int)(rem);
std::string downloadNow = strs_dn.str();
string remSize = "Remaining: " + downloadNow + " MB";
SetWindowText(hRemainingDownloadSTATIC, remSize.c_str());// set text to static control
double idownloadSpeed = currentDownloadSpeed/1024;
std::ostringstream strs_dnSp;
strs_dnSp << (unsigned int)(idownloadSpeed);
std::string downloadSpeed = strs_dnSp.str();
string downSize = "Download Speed: " + downloadSpeed + " KB/s";
SetWindowText(hDownloadSpeedSTATIC, downSize.c_str());// set text to static control
oldSeconds = currentSeconds;// save in old
oldDownloadNow = dlnow;// save in old
downloadIterationCounter = 0;
}
else
{
downloadIterationCounter++;
}
return 0;
}
任何幫助表示讚賞。非常感謝。
好像你正在編寫一個GUI程序 - 我認爲從主線程以外的任何位置更新UI並不是最好的主意。 – 2012-12-09 16:02:59
也許這就是我遇到奇怪的圖形錯誤的原因,比如應用程序的皮膚變成空白的灰色? :o您建議的正確方法是什麼?下載需要在其獨立的線程中。 – StudentX
爲什麼不問'pthread_main()'這樣做(只更新UI)? – 2012-12-09 16:25:01