吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2768|回复: 9
收起左侧

[C&C++ 转载] VC写多线程搜索器

  [复制链接]
吾爱看雪 发表于 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写多线程搜索器

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 吾爱看雪 发表于 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
厉害了有时间学习学习
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
学习了,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 01:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表