下载本文示例代码
操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。 本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然在线程内就处理了,这样实现了同步搜索。 以下介绍其在vc平台下的具体实现: 1.搜索用到两个win32的两个函数
HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData );BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); 2. 建立线程函数 首先要定义线程的参数结构用于文件信息的传递:
typedef struct tagTHREADPARAM { CString strPath; CString strFileName;}THREADPARAM m_param; 因为线程要操纵全局变量,所以定义互斥体:
CMutex m_mutexThreadCount,m_mutexThreadParam,m_mutexPath; 如果搜索完毕或搜索终止,要有事件通知,于是创建一个事件:
CEvent m_event(FALSE,FALSE,NULL,NULL);UINT uThreadCount=0;//产生的线程数CStringArray m_strPathArray;//存放搜索到的文件路径数组//线程函数UINT GetFilePathThreadProc(LPVOID pParam){ if(pParam==NULL) AfxEndThread(NULL); THREADPARAM * m_pParam=(THREADPARAM *)pParam; CString strPath=m_pParam->strPath; CString strFileName=m_pParam->strFileName; m_mutexThreadCount.Lock(); uThreadCount ; m_mutexThreadCount.Unlock(); HANDLE hFile; WIN32_FIND_DATA *pInfo=new WIN32_FIND_DATA; hFile = ::FindFirstFile(strPath "\\*.*",pInfo); if(hFile==INVALID_HANDLE_VALUE) { delete pInfo; m_mutexThreadCount.Lock(); uThreadCount--; //所有的线程完成,则激活事件,通知应用程序完成搜索(下同) if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0; } do{ if(pInfo->cFileName[0]==''.'') continue; char cFileName[MAX_PATH]; strcpy(cFileName,pInfo->cFileName); CString strFile=cFileName; if(pInfo->dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY) { //如果是目录,则开辟新的搜索线程 m_mutexThreadParam.Lock(); m_param.strPath=strPath "\\" strFile; m_param.strFileName=strFileName; AfxBeginThread(GetFilePathThreadProc,&m_param, THREAD_PRIORITY_NORMAL); m_mutexThreadParam.Unlock(); } else { //如果是文件则直接与要搜索的文件比较 if(strFile==strFileName){ m_mutexPath.Lock(); m_strPathArray.Add(strPath "\\" strFile); m_mutexPath.Unlock(); m_mutexThreadCount.Lock(); uThreadCount--; if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0; } } } while(::FindNextFile( hFile,pInfo)); ::FindClose(hFile); delete pInfo; m_mutexThreadCount.Lock(); uThreadCount--; if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0;}共2页。 1 2 :
操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。 本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然在线程内就处理了,这样实现了同步搜索。 以下介绍其在vc平台下的具体实现: 1.搜索用到两个win32的两个函数
HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData );BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); 2. 建立线程函数 首先要定义线程的参数结构用于文件信息的传递:
typedef struct tagTHREADPARAM { CString strPath; CString strFileName;}THREADPARAM m_param; 因为线程要操纵全局变量,所以定义互斥体:
CMutex m_mutexThreadCount,m_mutexThreadParam,m_mutexPath; 如果搜索完毕或搜索终止,要有事件通知,于是创建一个事件:
CEvent m_event(FALSE,FALSE,NULL,NULL);UINT uThreadCount=0;//产生的线程数CStringArray m_strPathArray;//存放搜索到的文件路径数组//线程函数UINT GetFilePathThreadProc(LPVOID pParam){ if(pParam==NULL) AfxEndThread(NULL); THREADPARAM * m_pParam=(THREADPARAM *)pParam; CString strPath=m_pParam->strPath; CString strFileName=m_pParam->strFileName; m_mutexThreadCount.Lock(); uThreadCount ; m_mutexThreadCount.Unlock(); HANDLE hFile; WIN32_FIND_DATA *pInfo=new WIN32_FIND_DATA; hFile = ::FindFirstFile(strPath "\\*.*",pInfo); if(hFile==INVALID_HANDLE_VALUE) { delete pInfo; m_mutexThreadCount.Lock(); uThreadCount--; //所有的线程完成,则激活事件,通知应用程序完成搜索(下同) if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0; } do{ if(pInfo->cFileName[0]==''.'') continue; char cFileName[MAX_PATH]; strcpy(cFileName,pInfo->cFileName); CString strFile=cFileName; if(pInfo->dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY) { //如果是目录,则开辟新的搜索线程 m_mutexThreadParam.Lock(); m_param.strPath=strPath "\\" strFile; m_param.strFileName=strFileName; AfxBeginThread(GetFilePathThreadProc,&m_param, THREAD_PRIORITY_NORMAL); m_mutexThreadParam.Unlock(); } else { //如果是文件则直接与要搜索的文件比较 if(strFile==strFileName){ m_mutexPath.Lock(); m_strPathArray.Add(strPath "\\" strFile); m_mutexPath.Unlock(); m_mutexThreadCount.Lock(); uThreadCount--; if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0; } } } while(::FindNextFile( hFile,pInfo)); ::FindClose(hFile); delete pInfo; m_mutexThreadCount.Lock(); uThreadCount--; if(uThreadCount==0) m_event.SetEvent(); m_mutexThreadCount.Unlock(); return 0;}共2页。 1 2 :
下载本文示例代码
VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索VC下利用多线程实现文件的快速检索
阅读(253) | 评论(0) | 转发(0) |