public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.ProgressBar probar;
private System.ComponentModel.IContainer components;
private int total_rownum = 0 ;
private int detail = 0;
private int flag = 0 ; 
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); }
[STAThread]
static void Main() 
{
Application.Run(new Form1());
} private void Form1_Load(object sender, System.EventArgs e)
{
Thread thread_detil = new Thread(new ThreadStart(Detail));
thread_detil.Start(); Thread thread_total = new Thread(new ThreadStart( Total_Row));
thread_total.Start();                    this.timer1.Stop();
Total_Row();
int num = total_rownum;

if(flag == 1)
{ timer1.Start();
} } private void timer1_Tick(object sender, System.EventArgs e)
{
this.probar.Maximum = total_rownum;
Detail();
if(detail>this.probar.Maximum)
{
detail = 0;
}
else
{
this.probar.Value = detail;
}
} public void Total_Row()
{
int total_rownum0=0 ;
SqlConnection sqlconn = new SqlConnection(strconn);
string sql_name = "select name from sysobjects where name like 'ZData_Info_%'";
SqlDataAdapter adp_name = new SqlDataAdapter(sql_name,sqlconn);
DataSet ds_name = new DataSet();
adp_name.Fill(ds_name);
DataView dv_name = ds_name.Tables[0].DefaultView;
for(int i=0;i<dv_name.Count;i++)
{
string lsobject = dv_name[i]["name"].ToString().Trim();
string sql_sub = "select count(*) from "+lsobject+" ";
SqlDataAdapter adp_sub = new SqlDataAdapter(sql_sub,sqlconn);
DataSet ds_sub = new DataSet();
adp_sub.Fill(ds_sub);
DataView dv_sub = ds_sub.Tables[0].DefaultView;
total_rownum0 += int.Parse(dv_sub[0][0].ToString());
}
 total_rownum = total_rownum0 ;
flag = 1; } public void Detail()
{
SqlConnection sqlconn = new SqlConnection(strconn);
string sql_name = "select name from sysobjects where name like 'ZData_Info_%'";
SqlDataAdapter adp_name = new SqlDataAdapter(sql_name,sqlconn);
DataSet ds_name = new DataSet();
adp_name.Fill(ds_name);
DataView dv_name = ds_name.Tables[0].DefaultView;
for(int i=0;i<dv_name.Count;i++)
{
string lsobject = dv_name[i]["name"].ToString().Trim();
string sql_sub = "select * from "+lsobject+" ";
SqlDataAdapter adp_sub = new SqlDataAdapter(sql_sub,sqlconn);
DataSet ds_sub = new DataSet();
adp_sub.Fill(ds_sub);
DataView dv_sub = ds_sub.Tables[0].DefaultView;
for(int j =0;j<dv_sub.Count;j++)
{
detail++;

}

}

}可是进度条总是到最后一下出现完,也就是说全局变量 detail 每次刷新的时候都取不到,直到函数Detail()执行完,不知道怎么解决,请高手们请教.

解决方案 »

  1.   

    异步调用
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpovrasynchronousdelegates.htm
      

  2.   

    多线程同步执行 请考虑同步、死锁、竟态各种情况 
    同步请用lock()
      

  3.   

    我的意思就是: 读取data_0101_一类的表,得到总记录数(行数),然后读取的时候可以知道我所在的进度,其中int detail 是进度条的值,不知道说清楚了没有.
      

  4.   

    to hdt(倦怠)
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpovrasynchronousdelegates.htm
     怎么打开的?
      

  5.   

    比如你设置你的进度条Maxnum=RecordCount
    when you read a record Increment the ProcessBar's Value
      

  6.   

    我找到原因了 是执行的太快了,不过我还不明白的一点是  detail每增加100就是用Threading.thread.sleep(10000),怎么还是和原来的情况一样呢?