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  阅读(1071)  评论(0编辑  收藏  举报

导航