目标:快速找某个文件夹下PE文件,并列出文件名来。判断文件是否为PE文件,我用的方法是看它的前两个字节是否是"4D 5A".现在问题就演变成"快速查找出现"4D 5A"串的文件"。
     我想先定义一个ArrayList数组做保存文件名用的,然后递归遍历这个文件夹里的所有文件和子文件夹里的所有文件,与此同时开10个子线程判断文件是否是以"4D 5A"开头,如果满足要求则把文件名送到一个数组里。     说起来容易,实现起来麻烦的很:
       
                    1.我是边遍历边判断,怎么控制好子线程在10个以内?
              2.怎么判断遍历完了,而且所以的子线程都结束了(也就是判断完了)?
 3.两个子线程如果同时想修改主程序的ArrayList数组会不会冲突了,假设用lock,没抢到锁的那个会不会丢失?而且跨线程操作好像还要用delegate?
              4.要是我想实现暂停功能,怎么同时暂停文件遍历和所有文件判断子线程?

         
我现在在一个环境比较恶劣的地方,没有开发资料,网上的那些例子太浅显了,不足以解决我这个问题,所以请大家帮帮我,解觉前三个问题就算救我半条命了,第四个凭个人兴趣。

解决方案 »

  1.   

                    1.我是边遍历边判断,怎么控制好子线程在10个以内? 
    你只创建个线程数组 
    Thread[] SearchThread =new Thread[10]; 不可以?              2.怎么判断遍历完了,而且所以的子线程都结束了(也就是判断完了)? 
    当你线程序冲ArrayList获取一个文件.然后移除这个文件. 等遍历完毕而且ArrayList为0的时候不就是完毕了?3.两个子线程如果同时想修改主程序的ArrayList数组会不会冲突了,假设用lock,没抢到锁的那个会不会丢失?而且跨线程操作好像还要用delegate? 
    这里只有ArrayList读取和删除 进行lock 其他不加不就可以了? 没抢到锁的线程会等其他线程执行完Lock才执行的.              4.要是我想实现暂停功能,怎么同时暂停文件遍历和所有文件判断子线程? 
    遍历可能要做记录当前遍历的位置..线程可以加一个bool控制就好了.
      

  2.   

    1、可以使用 Semaphore 锁定
    2、WaitHandle.WaitAll() http://msdn.microsoft.com/zh-cn/library/z6w25xa6.aspx
    3、不会丢失
    4、可以试试ManualResetEvent实现暂停ManualResetEvent _StopSign=new ManualResetEvent(true);
    For(.....)
    {
        _StopSign.WaitOne();
        //Other
    } void Suspend()
    {
    _StopSign.Reset();
    }void Resume()
    {
    StopSign.Set();
    }
      

  3.   

    还是不太完美。1.Thread[] SearchThread =new Thread[10]; 如果这样的话,我每次遍历到一个文件的时候都要循环检测这个线程数组里有没被用完、或还没被使用的线程,这样会不会有点太耗资源啊?2.我的ArrayList定义的是一个用来保存“被确诊为PE文件”的文件名,而不是一开始就把文件名全遍历出来。这样并发性更好,速度更快些,不过你的那种方法也可以作为我的备用方案。    这样的问题好像用,线程消息之类的东西解决很高效,可是我这方面很菜!
      

  4.   

    1,同上
    2,所有子线程的状态以及ArrayList
    3,集合对象,.net都已经封装了同步对象,查看msdn。

                        /* 执行到mUnique.WaitOne();这一句的时候,如果此时外界没有发送Suspend消息,也就是信号量没有被占用,
                         * 那么这一句可以立刻返回。因为不能总占着信号量,立即调用MUnique.ReleaseMutex();释放信号量是避免在
                         * 发送Suspend命令的时候出现等待;如果此时外界已经发送了Suspend消息,也就是说信号量已经被占用,
                         * 此时mUnique.WaitOne();不能立刻返回,需要等到信号量被释放才能继续进行,也就是需要调用Resume的时候,
                         * mUnique.WaitOne();才能获得信号量进行继续执行。
                         * 
                         * 此处用于服务的暂停与恢复,在线程过程中调用CThreadControl类的相关方法。
                         */
                        this.ThreadControl.MUnique.WaitOne();
                        this.ThreadControl.MUnique.ReleaseMutex();     //在每个线程中定义一个信号量,来控制暂停,开始(就是以上两句代码)
         //下面是控制类中的
         
         private Mutex mUnique;        /// <summary>
            /// 暂停子线程
            /// </summary>
            public void Suspend()
            {
                if( isStarted && !isSuspended )
                {
                    isSuspended = true;
                    mUnique.WaitOne();
                }
            }
       
            /// <summary>
            /// 恢复子线程
            /// </summary>
            public void Resume()
            {
                if( isStarted && isSuspended )
                {
                    isSuspended = false;
                    mUnique.ReleaseMutex();
                }
            }    我想先定义一个ArrayList数组做保存文件名用的,然后递归遍历这个文件夹里的所有文件和子文件夹里的所有文件,与此同时开10个子线程判断文件是否是以"4D 5A"开头,如果满足要求则把文件名送到一个数组里。ArrayList保存你找到得符合的文件么?这样是不是不对,应该是文件夹下所有的文件吧
    楼主你想过没有,你开10个线程,每个线程都做同样的事情。。那这个找文件的任务怎么分配给这10个线程。。
    我想的是,一个线程处理一个文件夹下的文件。这样容易分配。。或者对ArrayList.count跟中,达到一定数量就分配给以个线程处理。
      

  5.   

    一个线程处理一个文件夹下的文件——有多层的、或者有的文件夹里面只有几个文件而有的有上百个,怎么办?先定义一个ArrayList数组做保存文件名:——假设有很多文件,遍历一遍也要点时间啊?我担心别人点“扫描”时半天没反应,所以我想不管它有多少文件,边遍历边扫描。
    找文件的任务怎么分配给这10个线程:——这个好办我是用主程序线开了一个专门处理遍历和扫描的进程,再开启1到10个扫描子线程。因为我控制着线程的个数,所以同时控制着遍历的速度。
      

  6.   

    仅仅遍历文件命名和文件路径不会需要太长时间,所以可以先把所有要处理的文件放在ArrayList里面,然后把ArrayList分成10份交给10个线程处理,这样不会有重复处理的。
    10个线程访问ArrayList的不同部分不会出现死锁。
    给每个线程一个State,每个线程结束的时候Check这10个线程State的与运算,只要有一个false,就说明没处理结束。
      

  7.   

    不行的,csdn什么高手都有,最大的麻烦就是程序员之间对同一问题的想法太不同了。假设那个文件夹是
    D:盘之类的东西。
              1.遍历要很长时间,总不可能等半个小时后再开始扫描文件吧?
              2.ArrayList数组我原来只是用它来保存符合要求的文件名,但是如果把遍历出来的文件名都放进去很容易挤爆的。
     
           给每个线程一个State,每个线程结束的时候Check这10个线程State的与运算,只要有一个false,就说明没处理结束。——这个想法不错,如果是没有名字的线程你能做到吗,应该会有点麻烦。
      

  8.   

    我以前写过一个帖子描述了最简单的一个程序:http://topic.csdn.net/u/20090220/20/435B057A-F199-4BC2-BFC5-D9E0C438A498.html