好友
阅读权限20
听众
最后登录1970-1-1
|
吾爱看雪
发表于 2018-8-17 07:05
本帖最后由 吾爱看雪 于 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]='\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[MAX_PATH];
char strSearch[MAX_PATH];
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
完整的代码已经上传到附件中了,有需要的小伙伴可以下载哦。
土豪通道:
Find.rar
(1.87 MB, 下载次数: 14)
平民链接:VC写多线程搜索器 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|