分享
 
 
 

运用多线程技术实现文件的快速搜索

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

运用多线程技术实现文件的快速搜索

作者:四川工业大学 姜勇道

下载本文配套源代码

从一名初学者到如今一名熟练的VC程序员,得益于VC知识库的帮助,一直想着该如何回报。现撰此文,一来略表心意,二来和VC爱好者交流。

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

其基本思想其实很简单,就是找到一个目录就开辟一个线程,文件的话当然在线程内就处理了。这样实现了同步搜索,速度当然快起来了。

本文程序运行效果图

以下介绍VC具体实现:

一、 搜索用到两个win32的两个函数:

HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData );

BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData );

二、 建立线程函数

首先要定义线程的参数结构用于文件信息的传递:

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;

}

三、 调用线程函数执行搜索

void GetFilePath()

{

m_event.ResetEvent();//将事件置为无信号状态

uThreadCount=0;

m_strPathArray.RemoveAll();

m_param.strPath=m_strPath;

m_param.strFileName=m_strFileName;

m_param.m_pListInfo=&m_ListInfo;

//启动线程

AfxBeginThread(GetFilePathThreadProc,&m_param, THREAD_PRIORITY_NORMAL);

//等待搜索完成或终止事件的发生

::WaitForSingleObject(m_event.m_hObject,INFINITE);

if(m_strPathArray.GetUpperBound()==-1){

AfxMessageBox("没找到文件",MB_OK|MB_ICONINFORMATION);return;}

for(int i=0;i<m_strPathArray.GetSize();i++)

{

AfxMessageBox(m_strPathArray.GetAt(i),MB_OK|MB_ICONINFORMATION);

}

}

四、 如果想中途停止搜索,只需先将线程对象存放于一线程对象数组,当然每增加一个线程则添加一个线程对象到数组,每返回一个线程,则将该线程对象从数组中删除。这样在你想终止搜索时,可操作这些线程对象即可达到目的。具体调用两个函数:

BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode);

BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);

BOOL GetExitCodeThread(

HANDLE hThread, // handle to the thread

LPDWORD lpExitCode // address to receive termination status

);

BOOL TerminateThread(

HANDLE hThread, // handle to thread

DWORD dwExitCode // exit code

);

程序实现的具体情况请参见源代码。本文在VC++6.0和Windows2000环境中编译通过。

作者信息:

通讯地址:华中科技大学模具国家重点实验室 邮编430074

电话:027-87543492

电邮:jiangyongdao@sina.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有