MFC多线程:开了一个线程却和开了多个线程计算速度一样快,我很苦恼。
一个课题:开多个线程计算文件MD5值,但是开了多个线程计算的速率并没有快多少。 到底是哪耗费了时间。
以下是代码,我感觉逻辑上木有很大的错误 ,按思路速率应该会加快很多的。
.h// 头文件
public:
HANDLE handle[max_number];
void FindFile(LPCTSTR szPath);
CListCtrl m_List;
int nItem;
//全局定义
static UINT ThreadProc4(LPVOID pParam);//MD5线程
typedef struct listnode
{ char cFileName[MAX_PATH];
char MD5Num[100];
char sFilePath[1024];
BYTE byteStatus;//0X00 ,0x01
}slistnode;
.cpp// 主要函数。
CList<slistnode,slistnode&>list;//创建链表
void CDemoDlg::OnBnClickedMorethread()
{
//TODO: 在此添加控件通知处理程序
CString str;
long t1=GetTickCount();
m_List.DeleteAllItems();
list.RemoveAll();
LPMALLOC lpMalloc;
if(::SHGetMalloc(&lpMalloc)==NOERROR)
{
char szPath[1024];
char szfilePath[MAX_PATH];
memset(szPath,0,sizeof(szPath));
memset(szfilePath,0,sizeof(szfilePath));
BROWSEINFO path;
path.hwndOwner=GetSafeHwnd();
path.pidlRoot=NULL;
path.lpszTitle=_T("请选择搜索目录");
path.pszDisplayName=szfilePath;
path.ulFlags= BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_EDITBOX |BIF_NEWDIALOGSTYLE;
path.lpfn=NULL;
path.lParam=NULL;
LPITEMIDLIST pItemDList;
if((pItemDList=::SHBrowseForFolder(&path))!= NULL)
{
if(SHGetPathFromIDList(pItemDList,szfilePath))
{
strcpy(szPath,szfilePath);
FindFile(szPath);
for(int i=0;i<5;i++) // 开启多个线程
{
handle[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc4,NULL,0,0);
}
for(int i=0;i<5;i++)
{
WaitForSingleObject(handle[i],INFINITE);
}
/*handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc4,NULL,0,0);
WaitForSingleObject(handle[0],INFINITE);*/ //值开启一个线程
POSITION pos=list.GetHeadPosition();
while(pos!= NULL)
{
CString szFile=_T("");
char MD5[MAX_PATH];
char cFileName[MAX_PATH];
memset(MD5,0,sizeof(MD5));
memset(cFileName,0,sizeof(cFileName));
slistnode szlistPut;
szlistPut=list.GetNext(pos);
szFile=szlistPut.sFilePath;
strcpy(MD5,szlistPut.MD5Num);
strcpy(cFileName,szlistPut.cFileName);
nItem =m_List.InsertItem(0,(LPCTSTR)cFileName,NULL);
m_List.SetItemText(nItem, 1,szFile);
m_List.SetItemText(nItem, 2,(LPCTSTR)MD5);
}
}
lpMalloc->Free(pItemDList);
}
lpMalloc->Release();
}
long t2=GetTickCount();
str.Format("time:%dms",t2-t1);
AfxMessageBox(str);
}
void CDemoDlg::FindFile(LPCTSTR szPath)///历遍文件路径
{
CString strPathFile;
CString strMD5DespositPathFile;
char szFind[1024];
char szFile[1024];
char szTemp[100];
WIN32_FIND_DATA FindFileData;
memset( szFind,0,sizeof( szFind));//数组初始化
memset(szFile,0,sizeof(szFile));
memset(szTemp,0,sizeof(szTemp));
strcpy(szFind,szPath);
strcat(szFind,"\\*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
return;
}
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//链表,STL,数据内存,sql
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,szPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
FindFile(szFile);
}
}
else
{
strcpy(szFile,szPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
slistnode szListAdd;
strcpy(szListAdd.sFilePath,szFile);
strcpy(szListAdd.MD5Num,szTemp);
szListAdd.byteStatus=0x00;
strcpy(szListAdd.cFileName,FindFileData.cFileName);
list.AddTail(szListAdd);
}
if(!FindNextFile(hFind,&FindFileData))break;
}
FindClose(hFind);
}
UINT ThreadProc4(LPVOID pParam)//计算MD5线程
{
POSITION pos=list.GetHeadPosition();
CString strTempFile=_T("");
while(pos!=NULL)
{
POSITION oldpos=pos;
slistnode ListGet;
//memset(ListGet.MD5Num,0x00,100);
critical_section.Lock();
ListGet= list.GetNext(pos);
if(0x00==ListGet.byteStatus)
{
ListGet.byteStatus =0x01;
CString strTempFile =ListGet.sFilePath;
char*MD5Num=MD5Count((char *)(LPCTSTR)strTempFile,32);
strcpy(ListGet.MD5Num,MD5Num);
list.SetAt(oldpos,ListGet);
}
critical_section.Unlock();
}
return 0;
}
有时候开多个线程计算的相同文件的时间还要多于单个线程的计算时间。。是我的逻辑有问题么?还是线程挂起的时候耗费的时间较多??