//启动n个线程int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
for (int i = 0; i < n; i++)
{
Thread threads[i] = new Thread(new ThreadStart(MainAction));
}下面是生成线程的时候用的函数------此函数调用Myfun()
MainAction()
{
......n多语句 Myfun() ......n多语句
}Myfun()
{
在这里怎么获得调用他的线程的那个 i 值????????????????????问题在这里?????????
下面是根据i值执行不同的动作
}
for (int i = 0; i < n; i++)
{
Thread threads[i] = new Thread(new ThreadStart(MainAction));
}下面是生成线程的时候用的函数------此函数调用Myfun()
MainAction()
{
......n多语句 Myfun() ......n多语句
}Myfun()
{
在这里怎么获得调用他的线程的那个 i 值????????????????????问题在这里?????????
下面是根据i值执行不同的动作
}
http://blog.csdn.net/knight94/archive/2006/03/21/631238.aspx
比如你把
MainAction()和 Myfun()
封闭在一个类中,类内有一个属性,就是你所说的i,每个线程你实例一次这个类,传递不同的i值,能类的实例调用MainAction()
MainAction(i); // 在这里调用参数.
}
Thread th = new Thread(starter);
th.start();
....
总之就是搞他们并发, 而不是: 打开、执行、关闭;然后在打开、执行、关闭来循环,导致所有用户排队等候那一个连接
哪位大峡有好思路????
在本人笔记本上的 测试数据如下:
1分钟,1用户 插入数据 25141 行
1分钟,2用户 插入数据 31576 行
2分钟,2用户 插入数据 57719 行
2分钟,3用户 插入数据 61786 行插入数据条数不是我想象的成倍数关系,不知道为什么???????????
高手们帮我诊断一下啊public partial class SQLServerFrm : Form
{
const int jimNum = 300;//启动线程数目 static internal Thread[] threads = new Thread[jimNum];
//本地测试来连接 SQL 2005
private string connectionString = global::SQLloader.Properties.Settings.Default.Jim_EIM_DataConnectionString1;
//与数据库的连接
private SqlConnection[] myConnection = new SqlConnection[jimNum];//对应于线程的数据库连接
private SqlCommand[] tempSqlCommand = new SqlCommand[jimNum];];//对应于线程的command
private int iUserNum = 0;//并发用户数初始话,实际的值从界面的文本框获取
int iRuntime = 0;//运行时间长度,实际的值从界面的文本框获取
private DateTime dtStartTime;//运行开始时间
private DateTime dtEndTime;//运行结素时间 public SQLServerFrm()
{
InitializeComponent();
} //点运行按牛的动作
private void btnRun_Click(object sender, EventArgs e)
{
//开始运行的时间
dtStartTime = DateTime.Now; //获取运行时间长度
iRuntime =int.Parse(txtRunTime.Text.Trim())*60;//转换成秒
if (iRuntime <= 0)
{
MessageBox.Show("请输入一个大于0的数字!");
return;
} //获取并发用户数目
iUserNum = int.Parse(txtUserNum.Text.Trim());
if ((iUserNum <= 0) || (iUserNum > 300))
{
MessageBox.Show("并发用户数请输入一个大于0且小于300的数字!");
return;
} //点运行按纽的时候,打开计时器
timerRunTime.Enabled = true;
//timerRunTime.AutoReset = false;
timerRunTime.Interval = iRuntime * 1000;//把运行的时间长度当作及时器的周期
timerRunTime.Start(); //根据并发用户数,生成运行的线程
for (int i = 0; i < iUserNum; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(MainAction));
threads[i] = t;
}
for (int i = 0; i < iUserNum; i++)
{
threads[i].IsBackground = true;
threads[i].Start(i);
Thread.Sleep(2);
}
} //结束按纽的动作
private void btnStop_Click(object sender, EventArgs e)
{
//结束所有操作数据库的线程
KillAllThreads(iUserNum);
} //
//执行SQL语句----如insert,delete,update等
private void ExecSQL(string strSQL,int iSQL)
{
try
{
if ((myConnection[iSQL] == null) || (myConnection[iSQL].State == ConnectionState.Closed) || (myConnection[iSQL].State == ConnectionState.Broken))
{
myConnection[iSQL] = new SqlConnection(connectionString);
tempSqlCommand[iSQL] = new SqlCommand(strSQL, myConnection[iSQL]);
tempSqlCommand[iSQL].Connection.Open();
tempSqlCommand[iSQL].ExecuteNonQuery();//???
tempSqlCommand[iSQL].Dispose();
}
else
{
myConnection[iSQL].Close();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return;
}
finally
{
myConnection[iSQL].Close();
}
} //终止所有进程
private void KillAllThreads(int iRunUser)
{
for (int i = 0; i < iRunUser; i++)
{
if (threads[i].IsAlive)
{
threads[i].Abort();
}
} //停止记时器
timerRunTime.Stop();
} private void timerRunTime_Tick(object sender, EventArgs e)
{
//到第一个及时器周期结素杀掉所有
KillAllThreads(iUserNum);
MessageBox.Show("运行结束!");
return;
}
//
private void MainAction(object data)
{
int idata = Int32.Parse(data.ToString()); TimeSpan ts;
int differenceInSeconds = 0;
//根据设定的时间长度来循环
while (differenceInSeconds <= iRuntime)
{
string insertSQL = "insert AMERCE (AMERCEID,PWORD,PID) values ('jim3','aa','bb')";
ExecSQL(insertSQL,idata);
dtEndTime = DateTime.Now;
ts = dtEndTime - dtStartTime;
differenceInSeconds = ts.Seconds;
}
}
//
}
//启动n个线程int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
for (int i = 0; i < n; i++)
{
Thread threads[i] = new Thread(new ThreadStart(MainAction));
XXXXXXXXXX 在这里把I值赋给这个新建线程的NAME属性
}下面是生成线程的时候用的函数------此函数调用Myfun()
MainAction()
{
......n多语句 Myfun() ......n多语句
}Myfun()
{在这里用CURRENTTHREAD.NAME获取I值
然后按你的需要用SWITCH语句来做不同的操作
在这里怎么获得调用他的线程的那个 i 值????????????????????问题在这里?????????
下面是根据i值执行不同的动作
}
{
//传入参数
mainAction m = new mainAction( i );
Thread t = new Thread(new ParameterizedThreadStart( m.workstart));
threads[i] = t;
}
public class mainAction
{
//线程传入的参数
private int m_ThreadNum;
public mainAction( int ThreadNum )
{
this.m_ThreadNum = ThreadNum
} public void workstart()
{
int j = this.m_ThreadNum
}
}
delegate void MyFunDelegate(int index)for (int i = 0; i < n; i++)
{
MyFunDelegate md = new MyFunDelegate();
md.BeginInvoke(i,null,null);
}MyFun(int index)
{
bla... bal....
}
int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
for (int i = 0; i < n; i++)
{
Thread threads[i] = new Thread(new ThreadStart(MainAction));
threads[i].name = "thread"+i;
}
Thread[] t = new Thread[iUserNum];
for (int i = 0; i < iUserNum; i++)
{
//传入参数
m[i] = new mainAction( i );
t[i] = new Thread(new ParameterizedThreadStart( m.workstart));
t[i].Start();
}
有空多看点书