Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14498065
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:39

下载本文示例代码
  操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。  本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然在线程内就处理了,这样实现了同步搜索。  以下介绍其在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下利用多线程实现文件的快速检索
阅读(99) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~