VC写多线程搜索器
本帖最后由 吾爱看雪 于 2018-8-17 08:27 编辑文件搜索器要在指定的目录及所有下层子目录中查找文件,然后向用户显示出查找的结果,如果使用多线程的话
,就意味着各线程要同时在不同目录中搜索文件
这个程序最关键的地方是定义了一个动态的目录列表。
选择从CNoTrackObject类继承主要为了方便。当创建对象时,CNoTrackObject类中重载版本中operator new
会自动将对象里各成员的值初始化为0
在线程执行查找文件任务的时候,如果找到的是目录就将它添加到列表中,若找到的是文件
就到自定义CheckFile函数进行比较,判断是否符合查找的条件,若符合就打印出来,显示给用户
。线程在查找完一个目录以后,再从m_listDir列表中取出一个新的目录进行查找,同时将该目录对应的节点
从表中删除当m_listDir为空时,线程就要进入暂停的状态,等待其他线程向,m_listDir中添加新的目录
这里用一个事件对象m_hDirEvent
m_listDir 为空时,线程就调用WaitForSingleObject函数在此事件上等待,成为非活动线程"
当线程搜索到新的目录,并添加到m_listDir中后,就调用SetEvent函数将此事件对象置为受信状态,促使
等待在此对象上的一个线程恢复运行 成为"活动进程"
判断文件查找结束时仅判断m_listDir是否为空是不够的,因为当m_listDir为空时,有可能还有活动的线程
,这些活动的线程可能还会产生新的未查找的目录
,故只有在m_dirList为空且当前的活动线程数为0时才可以判定查找结束.
在查找结束,各个搜索线程将要终止的时候,还要通过一个事件对象通知 主线程.
主线程创建完各个搜索线程后就会在事件上等待 。辅助线程全部退出后,主线程才结束等待。
先说一下编写这个程序的基本流程原理
这个原理我会给大家的慢慢看!
下面我们来写
FinderEnter开始写这个函数
已经写了很长时间为了节省大家的时间我把剩下的代码补充完整
CFinder::CFinder(int nMaxThread):m_nMaxThread(nMaxThread) //构造函数
{
m_nResultCount=0;
m_nThreadCount=0;
m_szMatchName='\0';
m_listDir.Construct(offsetof(CDirectoryNode,pNext));
m_hDirEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
m_HExitEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
::InitializeCriticalSection(&m_cs);
}
CFinder::~CFinder() //析构函数
{
::CloseHandle(m_hDirEvent);
::CloseHandle(m_HExitEvent);
::DeleteCriticalSection(&m_cs);
}
CFinder::CheckFile(LPCTSTR lpszFileName) //成员函数
{
char string;
char strSearch;
strcpy(string,lpszFileName);
strcpy(strSearch,m_szMatchName);
_strupr(string);
_strupr(strSearch);
if(strstr(string,strSearch)!=NULL)
{return TRUE;}
return FALSE;
}
Linking...
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/Find.exe : fatal error LNK1120: 2 unresolved externals
完整的代码已经上传到附件中了,有需要的小伙伴可以下载哦。
土豪通道:
平民链接:VC写多线程搜索器 沙发自己的~~ 这么厉害,赞一个 学习了,谢谢分享
学习了,谢谢分享 貌似用起来有点小卡顿呀 厉害了{:1_911:}{:1_896:}{:1_893:}有时间学习学习 请规范代码
【公告】发帖代码插入教程
https://www.52pojie.cn/thread-713042-1-1.html
收藏了,回头参照着在aardio上练练 学习了,谢谢分享
页:
[1]