想写这样一个程序.采用双线程.T1去搜索硬盘上的*.exe文件.搜到以后立即告诉T2,然后T2将此文件名列出到窗体上的ListBox中.同时T1继续搜索.那么T1和T2之间的即时通信如何实现呀?
想写这样一个程序.采用双线程.T1去搜索硬盘上的*.exe文件.搜到以后立即告诉T2,然后T2将此文件名列出到窗体上的ListBox中.同时T1继续搜索.那么T1和T2之间的即时通信如何实现呀?
首先,定义一个公有集合
ArrayList AL_FileName=new ArrayList();
T1的线程代理函数
private void T1()
{
while(true)
{
string s=this.selectExtFile();//假设这是用来执行查找文件的函数
//在设置好循环的结束标志
}
}
private void T2()
{
while(true)
{
string filename=this.getAndDelItem();
if(filename!="")
{
//显示filename
}
//设置循环结束条件
}
}
private string getAndDelItem()
{
string s="";
lock(this)
{
if(this.AL_FileName.Count>0)
{
s=this.AL_FileName[0];
this.AL_FileName.RemoveAt(0);
}
}
return s;
}
首先,定义一个公有集合
ArrayList AL_FileName=new ArrayList();
T1的线程代理函数
private void T1()
{
while(true)
{
string s=this.selectExtFile();//假设这是用来执行查找文件的函数
//在设置好循环的结束标志
}
}
private void T2()
{
while(true)
{
string filename=this.getAndDelItem();
if(filename!="")
{
//显示filename
}
//设置循环结束条件
}
}
private string getAndDelItem()
{
string s="";
lock(this)
{
if(this.AL_FileName.Count>0)
{
s=this.AL_FileName[0];
this.AL_FileName.RemoveAt(0);
}
}
return s;
}
这样能做到即时通信吗?你这样做好象是两个线程好象是异步执行的呀!可不可以用消息队列来实现呢.T2搜到一个文件,向主线程发一消息.主线程接到消息后会触发相关的事件.
要是用到消息有这个问题,比如T1线程找到了一个exe,要求T2显示,但T2并没有获得CPU进行执行,如果T1再找到一个的时候则有可能将前一个已经找的文件名丢失,使用缓存队列就是为了避免这种情况
如果对即时要求比较高,也可以让T2使用线程池