VS2010MFC线程,进度条问题 在线等!

nanluming7891 2017-11-21 03:53:15
UINT CDiskSpeedDlg::ZWrite(LPVOID lpParam)
{

CString mv;
clock_t end;
clock_t start;
int count;

//m_write.GetWindowTextW(write);
CString str;
write->GetWindowText(str);
int e=_ttoi(str);
count=e;
CString ctd;
piece->GetWindowText(ctd);
int region= _ttoi(ctd);
CString filePath;
CString driveName;
//***************************************
conClean->GetWindowTextW(driveName);
CString fileName=_T("T2.dat");
filePath.Format ( _T("%s\\%s"),driveName,fileName);
//MessageBox(filePath);
TCHAR hh[512];
memset(hh, 0, sizeof(hh));
lstrcpy(hh,filePath);
HANDLE hFile = CreateFile(hh,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING|FILE_FLAG_OVERLAPPED,NULL);
//***************************************
//检查错误码
//LPVOID lpMsgBuf;
//FormatMessage(
// FORMAT_MESSAGE_ALLOCATE_BUFFER |
// FORMAT_MESSAGE_FROM_SYSTEM |
// FORMAT_MESSAGE_IGNORE_INSERTS,
// NULL,
// GetLastError(),
// MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
// (LPTSTR) &lpMsgBuf,
// 0,
// NULL
// );
//MessageBox( (LPCTSTR)lpMsgBuf);
//LocalFree( lpMsgBuf );
//********************************
/*if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("文件创建失败"));
}*/
//起始时间

//OnBnClickedRadio2();
//if(m_cache.GetCheck()==TRUE)//判断radio button是否被选中
CString qqq;
ttime->GetWindowText(qqq);
int m= _ttoi(qqq);
start = clock();
for(int i=0;i<count*1024/Block_size;i++)
{

WOffset = WOffset + MB_SIZE*Block_size;
overlap.Offset = WOffset & 0xffffffff ;
overlap.OffsetHigh = (WOffset>>32) & 0xffffffff;
BOOL rc = WriteFile(hFile,buf,region*1024*1024,&dwBytesWrite,&overlap);
/*if(rc == 0)
{
MessageBox(_T("WriteFile写文件失败"));*/
if (GetLastError() == ERROR_IO_PENDING)
{//当错误是ERROR_IO_PENDING,那意味着写文件的操作还在进行中
//等候,直到文件写完
//一直阻塞等到得到数据才继续下面。
//WaitForSingleObject(hFile, INFINITE);
//rc = GetOverlappedResult(hFile,&overlap,&dwBytesWrite,FALSE);
GetOverlappedResult(hFile,&overlap,&dwBytesWrite,TRUE);
}
else
{

break;
}
end = clock(); //结束时间
int d_time=(end-start)/1000; //获取时间差
tiime.Format(_T("%d"),d_time);
TTime->SetWindowTextW(tiime);
t =count*1024*MB_SIZE; //写入字节数
t = t/1024;
m=t/((end-start)-100); //瞬时速度
if((end-start)!=0)
t = t/(end-start); //平均速度
speed = t;
v.Format(_T("%d"),speed);
average_velocity->SetWindowTextW(v);
moment=m;
mv.Format(_T("%d"),moment);
moment_time->SetWindowTextW(mv);
//*******************************************************************
CProgressCtrl *Speed = (CProgressCtrl*)lpParam;
if((CProgressCtrl*)lpParam!=NULL)
{


if(Speed->GetPos()==nUpper)//判断当前光标是否等于最大值
{
Speed->SetPos(nLower);//设定初始位置
}
//用每一步的增量来增加进度条的当前位置
if(i%r==0)
{
Speed->StepIt();
}
}
if(qqq.Compare(tiime)==0)
{
break;
}
}
CloseHandle(hFile);
return 0;
}
问题在 CProgressCtrl *Speed = (CProgressCtrl*)lpParam;
if((CProgressCtrl*)lpParam!=NULL)
{


if(Speed->GetPos()==nUpper)//判断当前光标是否等于最大值
{
Speed->SetPos(nLower);//设定初始位置
}
//用每一步的增量来增加进度条的当前位置
if(i%r==0)
{
Speed->StepIt();
}
}
我是想在线程中操作进度条的,固定步长10%对循环次数取余来表示完成进度。现在出现的问题是if(Speed->GetPos()==nUpper)判断根本不进入而且Speed指针也没有传空,我现在找不到原因了求各位大佬解决解决,50分献上
...全文
166 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2017-11-21
  • 打赏
  • 举报
回复
断点看下这个GetPos()的值是什么,就知道为什么进不了。
汪宁宇 2017-11-21
  • 打赏
  • 举报
回复
直接SetRange(0, nMax) for(i=0; i<nMax; i++) SetPos(i):

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧