您的位置: 旅游网 > 明星 >> 陈坤

下利用多线程实现文件的快速检索覆盖

发布时间:2021-10-28 05:26:34

操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。

本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然程内就处理了,这样实现了同步搜索。

以下介绍其在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;

}

大同哪个医院治疗白癜风最好
沈阳医院男科治疗哪家好
南京治疗男性不孕不育
猜你会喜欢的
猜你会喜欢的