接上贴,线程访问全局变量有异常,高手接续帮忙解决一下
UINT CUpdateDlg::DownloadThread(void *pArg)
{
CUpdateDlg *pMainWnd = (CUpdateDlg *)pArg;
CHttpSocket HttpSocket;
CString strServer,strObject;
unsigned short nPort;
DWORD dwServiceType;
long nLength;
const char *pRequestHeader = NULL;
//CString xxx;
//xxx.Format("%d",pMainWnd->m_list.GetItemCount());
//AfxMessageBox(xxx);
for (int i=1;i <=pMainWnd->m_list.GetItemCount();i++){
AfxParseURL("http://www.ienno.com/UpFile/user/"+pMainWnd->UserName+"/"+pMainWnd->SoftID+"/update/"+pMainWnd->m_list.GetItemText(i-1,0),dwServiceType,strServer,strObject,nPort);
pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)strServer,(LPTSTR)(LPCTSTR)strObject,nLength);
HttpSocket.Socket();
HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer);
HttpSocket.SendRequest();
HttpSocket.SetTimeout(10000,0);
char szValue[30];
HttpSocket.GetField("Content-Length",szValue,30);
int nSvrState = HttpSocket.GetServerState();
int nFileSize = atoi(szValue);
int nSize = 0;
CFile DownloadFile;
DownloadFile.Open(pMainWnd->UpPath+"\\"+pMainWnd->m_list.GetItemText(i-1,0),CFile::modeCreate | CFile::modeWrite);
char pData[1024];
int nReceSize = 0;
DWORD dwStartTime,dwEndTime;
while(nSize < nFileSize)
{
dwStartTime = GetTickCount();
nReceSize = HttpSocket.Receive(pData,1024);
if(nReceSize == 0)
{
AfxMessageBox("服务器已经关闭连接.");
break;
}
if(nReceSize == -1)
{
AfxMessageBox("接收数据超时.");
break;
}
dwEndTime = GetTickCount();
DownloadFile.Write(pData,nReceSize);
nSize += nReceSize;
pMainWnd->nCompletedSize+=nSize;
CString xxx;
xxx.Format("%d",pMainWnd->nCompletedSize);
pMainWnd->SetDlgItemText(IDC_STATIC_STATUS,xxx);
pMainWnd->m_ctrlProgress.SetPos(pMainWnd->nCompletedSize / 1024);
}
DownloadFile.Close();
}
pMainWnd->SetDlgItemText(IDC_STATIC_STATUS,"下载完毕,点击下一步更新程序");
pMainWnd->GetDlgItem(IDOK)->EnableWindow(TRUE);
return 0;
}
void CUpdateDlg::OnOK()
{
// TODO: Add extra validation here
GetDlgItem(IDOK)->EnableWindow(FALSE);
UpdateData();
m_ctrlProgress.SetRange(0,totalSize / 1024);
AfxBeginThread(DownloadThread,(void *)this);
//CDialog::OnOK();
}
nCompletedSize是int nCompletedSize的全局变量,我输出nCompletedSize的值确实在变化,但是不仅不正确,居然还出现了负数