进度条的使用

 

在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。

第一步:设计界面不说了...注意需要引用 using System.Threading;
第二步:定义一个代理,用于更新ProgressBar的值(Value)

  1.         //更新进度列表
  2.         private delegate void SetPos(int ipos);

 

  1. 第三步:进度条值更新函数(参数必须跟声明的代理参数一样)
  1.         private void SetTextMessage(int ipos)
  2.         {
  3.             if (this.InvokeRequired)
  4.             {
  5.                 SetPos setpos = new SetPos(SetTextMessage);
  6.                 this.Invoke(setpos, new object[] { ipos});
  7.             }
  8.             else
  9.             {
  10.                 this.label1.Text = ipos.ToString() + "/100";
  11.                 this.progressBar1.Value = Convert.ToInt32(ipos);
  12.             }
  13.         }

第四步:函数实现

  1.         private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             Thread fThread = new Thread(new ThreadStart(SleepT));//开辟一个新的线程
  4.             fThread.Start();
  5.         }

第五步:新的线程执行函数:

  1.         private void SleepT()
  2.         {
  3.             for (int i = 0; i < 500; i++)
  4.             {
  5.                 System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
  6.                 SetTextMessage(100 * i / 500);
  7.             }
  8.         }

到此一个简单的进度条程序做好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中下载文件并解压缩可以使用以下步骤: 1. 使用WinHttp库下载文件,可以使用WinHttpOpen、WinHttpConnect、WinHttpOpenRequest和WinHttpSendRequest等函数来实现。 2. 下载完成后,使用zlib库解压缩文件。可以使用zlib库提供的函数gzopen、gzread和gzclose等函数来实现。 3. 在MFC界面上显示进度条,可以使用CProgressCtrl类来实现。可以使用SetRange函数设置进度条的范围,使用SetPos函数设置进度条当前的进度。 以下是一个简单的示例代码: ```cpp #include <Windows.h> #include <WinHttp.h> #include <zlib.h> #include <afxcmn.h> // 包含MFC界面相关头文件 #pragma comment(lib, "winhttp.lib") #pragma comment(lib, "zlibstat.lib") void DownloadFile(const CString& strUrl, const CString& strFileName, CProgressCtrl* pProgress) { HINTERNET hSession = NULL; HINTERNET hConnect = NULL; HINTERNET hRequest = NULL; BYTE buffer[1024]; DWORD dwRead = 0; DWORD dwTotal = 0; DWORD dwContentLength = 0; gzFile gz = NULL; int ret = 0; CStringA strUrlA(strUrl); CStringA strFileNameA(strFileName); // 打开WinHttp会话 hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) { // 处理错误 return; } // 连接服务器 hConnect = WinHttpConnect(hSession, strUrlA, INTERNET_DEFAULT_HTTP_PORT, 0); if (!hConnect) { // 处理错误 return; } // 创建请求 hRequest = WinHttpOpenRequest(hConnect, L"GET", strUrlA, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if (!hRequest) { // 处理错误 return; } // 发送请求 if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) { // 处理错误 return; } // 接收响应头 if (!WinHttpReceiveResponse(hRequest, NULL)) { // 处理错误 return; } // 获取响应头中的内容长度 DWORD dwLengthSize = sizeof(DWORD); if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwContentLength, &dwLengthSize, NULL)) { // 处理错误 return; } // 打开文件 HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { // 处理错误 return; } // 读取数据并写入文件 while (WinHttpReadData(hRequest, buffer, sizeof(buffer), &dwRead)) { if (dwRead > 0) { // 写入文件 DWORD dwWritten = 0; WriteFile(hFile, buffer, dwRead, &dwWritten, NULL); // 更新进度条 dwTotal += dwRead; if (pProgress) { pProgress->SetRange(0, dwContentLength); pProgress->SetPos(dwTotal); } } else { // 已经读取完毕 break; } } // 关闭文件 CloseHandle(hFile); // 解压缩文件 gz = gzopen(strFileNameA, "rb"); if (gz) { char outbuffer[1024]; while ((ret = gzread(gz, outbuffer, sizeof(outbuffer))) > 0) { // 写入解压缩后的数据 CString strOut(outbuffer, ret); CString strTemp(strOut); strTemp.Replace(L"\r\n", L"\n"); strOut = strTemp; HANDLE hFileOut = CreateFile(strFileName + L".out", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFileOut != INVALID_HANDLE_VALUE) { DWORD dwWritten = 0; WriteFile(hFileOut, strOut.GetBuffer(), strOut.GetLength() * sizeof(WCHAR), &dwWritten, NULL); CloseHandle(hFileOut); } } gzclose(gz); } // 关闭请求 WinHttpCloseHandle(hRequest); // 关闭连接 WinHttpCloseHandle(hConnect); // 关闭会话 WinHttpCloseHandle(hSession); } ``` 以上代码中,DownloadFile函数用于下载文件并解压缩,其中strUrl为下载文件的URL,strFileName为下载后保存的文件名,pProgress为用于显示进度条的CProgressCtrl指针。在函数中使用WinHttp库下载文件,使用zlib库解压缩文件,并在下载过程中更新进度条

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值