111,123
社区成员
发帖
与我相关
我的任务
分享
private int nMaxThreads, nThreads;
public delegate void CB_SetDataGridViewInfo(DataGridViewRow dgvr);
public void Deg_SetDataGridViewInfo(DataGridViewRow dgvr)//委托的方法
{
if (this.dataGridViewX1.InvokeRequired)
{
CB_SetDataGridViewInfo cs = new CB_SetDataGridViewInfo(Deg_SetDataGridViewInfo);
this.BeginInvoke(cs, new object[] { dgvr });
}
else
{
dataGridViewX1.Rows.Add(dgvr);
dataGridViewX1.FirstDisplayedScrollingRowIndex = dataGridViewX1.Rows.Count;
}
}
private void Thd_Start(object objPara)//线程
{
do something.........//主要工作
DataGridViewRow dgvr = new DataGridViewRow();
dgvr.CreateCells(dataGridViewX1);
for (int i = 0; i < 10; i++)
{
dgvr.Cells[i].Value = i;//这里是工作后的结果,用i临时代替一下
}
lock(this)
{
nThreads -= 1;//线程数减一
}
Deg_SetDataGridViewInfo(dgvr);// 托管调用
}
private void btxStart_Click(object sender, EventArgs e)
{
if (tbxOpenFile.Text == null)
{
MessageBox.Show("请选择数据文件!");
return;
}
string[] strLines = File.ReadAllLines(tbxOpenFile.Text, Encoding.Default);
int nRows = strLines.Length;//总行数
nMaxThreads = (int)nUDThread.Value;
nThreads = 0;
int nNow = 0;
do
{
if (nThreads < nMaxThreads)//比较线程数有没有到最大限制
{
int nT = nMaxThreads - nThreads;
for (int i = 0; i < nT; i++)
{
string strLine = strLines[nNow + i];
Thread StartVerifyThread = new Thread(new ParameterizedThreadStart(Thd_StartVerify));
StartVerifyThread.IsBackground = true;
StartVerifyThread.Start(strLine);
}
lock (this)
{
nNow += nT;
nThreads += nT;
}
}
} while (nNow != nRows);//处理完所有数据行
}
do
{
if (nThreads < nMaxThreads)//比较线程数有没有到最大限制
{
int nT = nMaxThreads - nThreads;
for (int i = 0; i < nT; i++)
{
string strLine = strLines[nNow + i];
Thread StartVerifyThread = new Thread(new ParameterizedThreadStart(Thd_StartVerify));
StartVerifyThread.IsBackground = true;
StartVerifyThread.Start(strLine);
}
lock (this)
{
nNow += nT;
nThreads += nT;
}
}
} while (nNow != nRows);//处理完所有数据行
这样起线程方式有合理,现在改成线程数固定,每个线程处理多行数据.再用委托就没问题了!
DataTable dt = new DataTable();
dt.Columns.Add("Name");
for (int i = 0; i < 10; i++)
{
dt.Rows.Add(i);
}
dataGridView1.DataSource = dt;
21.private void 读文本(string 文件名称, string 比较内容)
{
List<string> 内容 = new List<string>(); bool 控制 = true;
if (Directory.Exists(保存路径))
{
FileInfo 文件 = new FileInfo(文件名);
if (文件.Exists)
{
using (FileStream 打开 = new FileStream(文件名, FileMode.Open))
{
using (StreamReader 读取 = new StreamReader(打开, Encoding.UTF8))
{
while (!读取.EndOfStream)
{
if (比较内容 == "") 内容.Add(读取.ReadLine());
else
if (比较内容 == 读取.ReadLine()) { 控制 = false; break; }
}
打开.Close(); if (控制) 记录文本(比较内容, 文件名称);
}
}
}
}
foreach (string 数据 in 内容) if (数据.Contains("☆")) { 补缺地址(数据); }
}
就好像这个方法一样读数据到数组,然后传递给方法去处理,再如如下方法就是使用线程和委托当然这里只是举例而已:
private void 时间_Tick(object sender, EventArgs e)
{
Thread 线程 = new Thread(delegate()
{
if (秒 < 59) 秒++; else { 秒 = 0; 分++; } if (分 == 60) { 分 = 0; 时++; } if (时 == 5) 时 = 0;
this.Invoke(new Action(() =>
显示时间.Text = DateTime.Parse(时.ToString("0:") + 分.ToString("00:") + 秒.ToString("00")).ToLongTimeString()));
}); 线程.Start();
}
lock(this)
{
nThreads -= 1;//线程数减一
}
this.BeginInvoke(.....)
你的代码可真够繁琐曲折的。