lock在多线程中的应用
最近完成一个从网页抓取数据的小系统---航班数据获取系统。系统的实现分为如下三个步骤:
第一:获取机场三字代码。世界上每个机场都有唯一的由三个大写英文字母组成的代码。
第二:获取理论航线。理论上,每两个机场便可组成一条航线(此处不考虑经停机场),当然实际上,不可能。本系统采用的方法是,先获取理论航线,然后筛选实际航线。
第三:获取航班。
第四:获取实际航线。
具体的实现如下:
第一:google一个机场三字代码网页,解析该网页,获取到数据。
string targetURL = "http://www.……";
webclient wc = new webclient();
byte[] myDataBuffer = wc.DownloadData(targetURL);
string s = System.Text.ASCIIEncoding.Default.GetString(myDataBuffer);//把html转变为string类型
int x = s.indexof("……");
int y = s.indexof("……");
string sData = s.substring(x,y-x);//数据
第二:机场两两顺序组合。
foreach(data1 in table1)
{
foreach(data2 in table2)
{
……
}
}
第三:这一步用到了多线程
重点1:lock(对象)方法
dataset ds = new dataset();
datatable dt = new datatable();
OracleDataAdapter da = new OracleDataAdapter("select语句",conn); //获取所有的航线
da.Fill(ds);
dt = ds.Tables[0];
int iCount = dt.Rows.Count();//航线数目
object obj = new object();//用于lock的对象
DataRow newrow;//当前行
int iCurrcount; //当前行号
bool bTag = true;
Thread thread1 = new Thread(new ThreadStart(GetData));
thread1.IsBackground = true;//后台线程
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(GetData));
thread2.IsBackground = true;//后台线程
thread2.Start();
priviat void GetData()
{
while(true)
{
lock(obj)//线程共享当前行这个变量,所以要锁住
{
if(iCurrCount < iCount)
{
bTag = true;
newrow = dt.Rows[iCurrCount];
iCurrCount++;
}
else
{
bTag = false;
}
if(btag == false)
{
break;
}
}
//获取网页
//解析数据
//写入数据库
}
重点2:WinForm界面时实更表
系统需要实时地在界面上显示获取数据的进展,采用了progressbar控件。
delegate void SetBar(int iNum)//过程值
{
if(this.InvokeRequired)
{
this.BeginInvoke(new dTxt(SetBar),iNum)
}
else
{
this.progressbar1.value = iNum;
}
}
在第三步的
if(iCurrCount < iCount)
{
bTag = true;
newrow = dt.Rows[iCurrCount];
SetBar(iCurrCount);
iCurrCount++;
}
第四:从航班表中取出所有的航线,即为实际航线。
小结:多线程、WinForm均是初次涉及,系统完成之过程颇为艰难,在此感谢博客园的园友们和CSDN的朋友们和Steven和王师兄。
posted on 2010-03-29 16:59 WildFlower 阅读(1092) 评论(0) 编辑 收藏 举报