using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using FastWay.Data;
using DevComponents.DotNetBar.Controls;
using System.Threading;namespace FastWay
{
public partial class EnterForm : Office2007Form
{
public AutoResetEvent WaitLoginEvent = new AutoResetEvent(false);
public AutoResetEvent WaitCheckNumber = new AutoResetEvent(false);
public EnterForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
RefreshData();
cmbTaskType.SelectedIndex = 0;
}
public delegate void AppendTextHandler(string msg);
public delegate int GetCheckIndexHandler();
public delegate string GetCheckTextHandler();
private void AppendMessage(string msg)
{
if (txtMsgbox.InvokeRequired)
{
txtMsgbox.Invoke(new AppendTextHandler(AppendMessage), new object[] { msg }); }
else
{
txtMsgbox.AppendText(msg + "\n");
Application.DoEvents();
}
}
public string GetCheckNumber()
{
if (cmbQList.InvokeRequired) { return (string)cmbQList.Invoke(new GetCheckTextHandler(GetCheckNumber), null); }
else { return cmbQList.SelectedText; }
}
public int GetCheckIndex()
{
if (cmbQList.InvokeRequired) { return (int)cmbQList.Invoke(new GetCheckIndexHandler(GetCheckIndex), null); }
else { return cmbQList.SelectedIndex; }
}
/// <summary>
/// 绑定数据源
/// </summary>
public void RefreshData()
{
DataTable dataTable = AccountManager.GetNoLockList();
if (dataTable != null && dataTable.Rows.Count > 0)
{
DataRow dr = dataTable.NewRow();
dr["QNumber"] = string.Empty;
dataTable.Rows.InsertAt(dr, 0);
}
cmbQList.DataSource = dataTable;
cmbQList.DisplayMember = "QNumber";
} private void cbAuto_CheckedChanged(object sender, EventArgs e)
{
cmbQList.Enabled = false;
} private void btnExcute_Click(object sender, EventArgs e)
{
ThreadParameter Parameter = null;
for (int i = 0; i < 3; i++)
{
if (i == 0) { WaitLoginEvent.Set(); }
WaitLoginEvent.WaitOne();
Parameter = new ThreadParameter(i + 1);
Thread currThread = new Thread(new ParameterizedThreadStart(RunWork));
//currThread.IsBackground = true;
currThread.Start(Parameter);
}
} public void RunWork(object Parameter)
{
WaitLoginEvent.Reset();
ThreadParameter CurrParameter = Parameter as ThreadParameter;
AppendMessage("线程:" + CurrParameter.ThreadIndex + "正在等待您选择号码");
WaitCheckNumber.WaitOne();
string selNumber = GetCheckNumber();
AppendMessage(string.Format("线程:{0}_当前选择的号码为:{1}", CurrParameter.ThreadIndex, selNumber));
RefreshData();
WaitLoginEvent.Set();
WaitCheckNumber.Reset();
} private void cmbQList_Leave(object sender, EventArgs e)
{
string selValue = GetCheckNumber();
int selIndex = GetCheckIndex();
if (!string.IsNullOrEmpty(selValue) && selIndex > 0) { WaitCheckNumber.Set(); }
}
}
/// <summary>
/// 线程参数集
/// </summary>
public class ThreadParameter
{
public int ThreadIndex { get; set; }
public string QNumber { get; set; }
public ThreadParameter(int index) { this.ThreadIndex = index; }
public ThreadParameter(int index, string qNumber) { this.ThreadIndex = index; this.QNumber = qNumber; }
}
}思路是想等第一个线程选择号码完成登录后启动第二个线程,但是运行之后发现界面上面的号码选择框无法输入也无法选择,就像界面死掉了一样,求大虾门指点一下。多线程
解决方案 »
- 求一正则表达式
- 为什么主页中的iframe所连接的页面报$未定义!!!
- vs2005对web程序(由vss导出的)断点调试不可用
- 请问在winform里,如何通过鼠标的拖动,来改变一个控件的大小,比如说picturebox?类似于窗体的拖放
- Codesmith如何将结果输出到文件阿
- 请问ASP.NET中的 Response.Write("<Script>alert('没有相关会议主题!')</Script>");中如何换行
- winform中单击datagrid的标题列,我怎样才能获得这个列的index?我已经把它变成了模板列了
- c#如何针对Powerpoint编程
- 各位大虾,关于文件加密问题,谢谢参与
- 关于窗体间的操作。
- C#实现SQL数据库关系图效果
- c# dataGridView 导出到 excel问题
WaitLoginEvent.WaitOne();
这句写在UI线程里面肯定会阻塞UI,
还有这句WaitCheckNumber.WaitOne();后面的代码怎么执行下去来通知WaitLoginEvent继续执行,把这句去掉试一试。
所以btnExecute_Click中的WaitOne 会始终处于阻塞状态,没有return自然就造成UI无法响应了。
你上面所说的逻辑还是换个思路做吧……