目标:快速找某个文件夹下PE文件,并列出文件名来。判断文件是否为PE文件,我用的方法是看它的前两个字节是否是"4D 5A".现在问题就演变成"快速查找出现"4D 5A"串的文件"。
我想先定义一个ArrayList数组做保存文件名用的,然后递归遍历这个文件夹里的所有文件和子文件夹里的所有文件,与此同时开10个子线程判断文件是否是以"4D 5A"开头,如果满足要求则把文件名送到一个数组里。 说起来容易,实现起来麻烦的很:
1.我是边遍历边判断,怎么控制好子线程在10个以内?
2.怎么判断遍历完了,而且所以的子线程都结束了(也就是判断完了)?
3.两个子线程如果同时想修改主程序的ArrayList数组会不会冲突了,假设用lock,没抢到锁的那个会不会丢失?而且跨线程操作好像还要用delegate?
4.要是我想实现暂停功能,怎么同时暂停文件遍历和所有文件判断子线程?
我现在在一个环境比较恶劣的地方,没有开发资料,网上的那些例子太浅显了,不足以解决我这个问题,所以请大家帮帮我,解觉前三个问题就算救我半条命了,第四个凭个人兴趣。
我想先定义一个ArrayList数组做保存文件名用的,然后递归遍历这个文件夹里的所有文件和子文件夹里的所有文件,与此同时开10个子线程判断文件是否是以"4D 5A"开头,如果满足要求则把文件名送到一个数组里。 说起来容易,实现起来麻烦的很:
1.我是边遍历边判断,怎么控制好子线程在10个以内?
2.怎么判断遍历完了,而且所以的子线程都结束了(也就是判断完了)?
3.两个子线程如果同时想修改主程序的ArrayList数组会不会冲突了,假设用lock,没抢到锁的那个会不会丢失?而且跨线程操作好像还要用delegate?
4.要是我想实现暂停功能,怎么同时暂停文件遍历和所有文件判断子线程?
我现在在一个环境比较恶劣的地方,没有开发资料,网上的那些例子太浅显了,不足以解决我这个问题,所以请大家帮帮我,解觉前三个问题就算救我半条命了,第四个凭个人兴趣。
解决方案 »
- C# MDI父窗体调用 dll子窗体的架构如何实现
- 编辑时获取DataList前台参数
- c# 智能提示的实现,我是想在richtextbox里实现和VS一样的智能提示功能,应该怎么做呢?希望有代码
- 请zhzuo(秋枫)进,除了昨天哪问题,还有一大堆,
- c# 强制结束进程
- IComparable接口为什么有一个普通版本的,一个泛型版本的?
- 求个自定义控件,非常经典的:两个listbox和四个按钮(left,right,allleft,allright),在线~~~
- .net 1.1 remoting事件驱动问题
- 如何在asp.net中用OpenFileDialog~!!
- 算法设计
- listbox
- 一个十分奇怪的问题,大家快来看看吧!
你只创建个线程数组
Thread[] SearchThread =new Thread[10]; 不可以? 2.怎么判断遍历完了,而且所以的子线程都结束了(也就是判断完了)?
当你线程序冲ArrayList获取一个文件.然后移除这个文件. 等遍历完毕而且ArrayList为0的时候不就是完毕了?3.两个子线程如果同时想修改主程序的ArrayList数组会不会冲突了,假设用lock,没抢到锁的那个会不会丢失?而且跨线程操作好像还要用delegate?
这里只有ArrayList读取和删除 进行lock 其他不加不就可以了? 没抢到锁的线程会等其他线程执行完Lock才执行的. 4.要是我想实现暂停功能,怎么同时暂停文件遍历和所有文件判断子线程?
遍历可能要做记录当前遍历的位置..线程可以加一个bool控制就好了.
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();
}
2,所有子线程的状态以及ArrayList
3,集合对象,.net都已经封装了同步对象,查看msdn。
4
/* 执行到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跟中,达到一定数量就分配给以个线程处理。
找文件的任务怎么分配给这10个线程:——这个好办我是用主程序线开了一个专门处理遍历和扫描的进程,再开启1到10个扫描子线程。因为我控制着线程的个数,所以同时控制着遍历的速度。
10个线程访问ArrayList的不同部分不会出现死锁。
给每个线程一个State,每个线程结束的时候Check这10个线程State的与运算,只要有一个false,就说明没处理结束。
D:盘之类的东西。
1.遍历要很长时间,总不可能等半个小时后再开始扫描文件吧?
2.ArrayList数组我原来只是用它来保存符合要求的文件名,但是如果把遍历出来的文件名都放进去很容易挤爆的。
给每个线程一个State,每个线程结束的时候Check这10个线程State的与运算,只要有一个false,就说明没处理结束。——这个想法不错,如果是没有名字的线程你能做到吗,应该会有点麻烦。