下利用多线程实现文件的快速检索覆盖
操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。
本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然程内就处理了,这样实现了同步搜索。
以下介绍其在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_ck();
uThreadCount++;
m_lock();
HANDLE hFile;
WIN32_FIND_DATA *pInfo=new WIN32_FIND_DATA;
hFile = ::FindFirstFile(strPath+\"\\\\*.*\",pInfo);
if(hFile==INVALID_HANDLE_VALUE)
{
delete pInfo;
m_ck();
uThreadCount--;
//所有的线程完成,则激活事件,通知应用程序完成搜索(下同)
if(uThreadCount==0)
m_tEvent();
m_lock();
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_ck();
m_rPath=strPath+\"\\\\\"+strFile;
m_rFileName=strFileName;
AfxBeginThread(GetFilePathThreadProc,m_param, THREAD_PRIORITY_NORMAL);
m_lock();
}
else
{
//如果是文件则直接与要搜索的文件比较
if(strFile==strFileName){
m_ck();
m_d(strPath+\"\\\\\"+strFile);
m_lock();
m_ck();
uThreadCount--;
if(uThreadCount==0)
m_tEvent();
m_lock();
return 0;
}
}
}
while(::FindNextFile( hFile,pInfo));
::FindClose(hFile);
delete pInfo;
m_ck();
uThreadCount--;
if(uThreadCount==0)
m_tEvent();
m_lock();
return 0;
}
大同哪个医院治疗白癜风最好沈阳医院男科治疗哪家好
南京治疗男性不孕不育
- 廖彬宇作人古诗选:天行记七律
- 为什么越来越少人在同学群说话?真实原因很现实,多少人都懂!
- 近似于自然风的循环风 斗禾独角兽Unicorn伸缩循环扇XHD03采用评测
- "零售之王"换帅尘埃落定!27年"老招行"王良接棒,保持战略监督不偏移、不动摇
- 搜狐V8.0.23内测版,做出众多调整,抢尝鲜体验(附下载)
- 证监会增补基金管理办法,从准入到监管全链条管理
- 油价多空分歧加剧,将急跌至65美元还是涨至400美元?
- 末节18分+准小胜!莫兰特一场论别急着吹,他可能是下一个威少?
- 极富《我的前半生》,女主美成惊鸿仙子,男主被绑架后拍成了电影
- 汇丰银行佛山市分行: 建行生活上线网点取号功能
- 疫情期间,如何更安全地外出就餐?上海疾控权威解答来了→
- 在同事前面,不想做这三件事情,做的越多越得罪人