吾爱看雪 发表于 2018-8-17 07:05

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写多线程搜索器

吾爱看雪 发表于 2018-8-17 07:21

沙发自己的~~

hpuyst 发表于 2018-8-17 07:44

这么厉害,赞一个

hairch 发表于 2018-8-17 07:54

学习了,谢谢分享

小小学生 发表于 2018-8-17 08:29


学习了,谢谢分享

ws100200111 发表于 2018-8-17 08:32

貌似用起来有点小卡顿呀

Sydhy 发表于 2018-8-17 08:41

厉害了{:1_911:}{:1_896:}{:1_893:}有时间学习学习

wushaominkk 发表于 2018-8-17 09:19

请规范代码
【公告】发帖代码插入教程
https://www.52pojie.cn/thread-713042-1-1.html

micksoft 发表于 2018-8-17 15:13

收藏了,回头参照着在aardio上练练

yuanmengxiaozi 发表于 2018-9-9 09:49

学习了,谢谢分享
页: [1]
查看完整版本: VC写多线程搜索器