求 如何使用多线程对控制多路串口实时通讯程序 本帖最后由 TANGLIJUNASP 于 2010-03-14 13:20:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #region public void StartThread() { StopThread(); timerThread = new Thread(new ThreadStart(UpdataThread)); //获取或设置一个值,该值指示某个线程是否为后台线程。 timerThread.IsBackground = true; timerThread.Start(); } //停止线程 public void StopThread() { if (timerThread != null) { //中断线程 timerThread.Interrupt(); timerThread = null; } } //更新线程 public void UpdataThread() { try { //在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。 MethodInvoker mi = new MethodInvoker(this.TreadReadStdMeterPower); //MethodInvoker mi = new MethodInvoker(this.AutoAdjust); while (true) { //在创建控件的基础句柄所在线程上异步执行指定的委托 this.BeginInvoke(mi); //timer1.Enabled = true; //timer1.Interval = 2000; Application.DoEvents(); Thread.Sleep(1000); } } catch (ThreadInterruptedException) { //针对具体问题定制异常抛出显示 } finally { //做一些处理 } } #endregion private void TreadReadStdMeterPower() { byte[] data = new byte[255]; string[,] expData = null; object[] tmpData = new object[34]; byte[] bytSendData = new byte[255]; try { bytSendData = CL3013.ReadStdMeterData(); data = comStdMeterPower.SendAndRecived(bytSendData); if (data != null) { if (data[4].ToString("x2") == "50") { clsCLT1_1.AnsDatExplan(data, ref expData); Ua.Text = expData[0, 2]; Ub.Text = expData[0, 1]; Uc.Text = expData[0, 0]; Ia.Text = expData[0, 5]; Ib.Text = expData[0, 4]; Ic.Text = expData[0, 3]; PhiA.Text = expData[3, 2]; PhiB.Text = expData[3, 0]; PhiC.Text = expData[3, 0]; P.Text = expData[4, 3]; Q.Text = expData[4, 7]; S.Text = expData[5, 3]; txtUa.Text = Ua.Text; txtIb1.Text = Ia.Text; txtIb2.Text = Ib.Text; txtP1.Text = expData[4, 2]; txtP2.Text = expData[4, 1]; double tmpUa = Convert.ToDouble(expData[0, 2]) * 10000; double tmpIa = Convert.ToDouble(expData[0, 5]) * 1000000; double tmpIb = Convert.ToDouble(expData[0, 5]) * 1000000; double tmpPa = Convert.ToDouble(expData[4, 2]) * 1000000; double tmpPb = Convert.ToDouble(expData[4, 1]) * 1000000; UaValues = (int)tmpUa; IaValues = (int)tmpIa; IbValues = (int)tmpIb; PaValues = (int)tmpPa; PbValues = (int)tmpPb; } else { structErrorMsg.Addlog(1, "返回的数据不符合协议要求!", txtMsg); } } else { structErrorMsg.Addlog(1, "没有返回数据!", txtMsg); } } catch (Exception ex) { structErrorMsg.Addlog(1, "没有返回数据!错误原因:" + ex.ToString(), txtMsg); } } public byte[] SendAndRecived( byte[] tmpByte) { lock (snyBark) { try { //参数输入的不合法 if (tmpByte == null || tmpByte.Length <= 0 || !this._isOpen) return null; structErrorMsg.Addlog(2, clsComApp.Convert_ByteArray_HexString(tmpByte), txtMsg); sp.Write(tmpByte, 0, tmpByte.Length); Application.DoEvents(); Thread.Sleep(DelayTime); int count = sp.BytesToRead; //缓冲区中没有数据 if (count == 0) return null; byte[] temp_Data = new byte[count]; int num = sp.Read(temp_Data, 0, count); for (int i = 0; i < count; i++) { temp_Data[i] = temp_Data[i]; } Szclou.Cl1000at.Adjust.structErrorMsg.Addlog(1, Szclou.Cl1000at.Adjust.clsComApp.Convert_ByteArray_HexString(temp_Data), txtMsg); return temp_Data; } catch { return null; } } while (true){//在创建控件的基础句柄所在线程上异步执行指定的委托this.Invoke(mi);//timer1.Enabled = true;//timer1.Interval = 2000;Application.DoEvents();Thread.Sleep(100);}将UpdataThread方法中的循环修改下,sleep也不要太长时间 关注,想问一下怎么在windows窗体中用线程控制串口(即从串口中读或写数据吧),只要编程思路即可。 因为见到的线程编程基本上都是从Main(),开始的,不知道怎么在windowsForm里做。 问题已得到解决,对ui交互的控件事件做了委托;同时,也顺便回复sp1234,calltaotao两个人的发言: 我是很礼貌的提出源码,希望你们能帮我解决问题;我写的代码怎么啦,是有问题,才请教你们我现在是在赶项目进度,解决问题是第一准则,没功夫遵循那么多规则);我见过牛B的人,但没见过你这么不懂礼貌的人;你这么不把人家放在眼里,我想你在公司也得不到别人的尊重;如再发现有人不尊重别人,直接把你从本版剔除出去 顶者有分!WinForms登录窗体如何自动登录 关于Datagridview C#播放MP3如何做啊? 那个播放不能连续播放~ 异步网络通信编程问题 C# 神啊,我变傻啦? 导数据的程序 添加web引用时候地址是变的怎么办 获取系统当前时间的前一天时间 测试测试,ftp客户端组件,唔,有的机子上可以,有的机子上怎么就不行,HELP!!!!! 求救高手:如何将Object类型的对象转换成byte[] C#连接局域网ORACLE数据库及查询问题 简单问题- -
public void StartThread()
{
StopThread();
timerThread = new Thread(new ThreadStart(UpdataThread));
//获取或设置一个值,该值指示某个线程是否为后台线程。
timerThread.IsBackground = true;
timerThread.Start();
}
//停止线程
public void StopThread()
{
if (timerThread != null)
{
//中断线程
timerThread.Interrupt();
timerThread = null;
}
}
//更新线程
public void UpdataThread()
{
try
{
//在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
MethodInvoker mi = new MethodInvoker(this.TreadReadStdMeterPower);
//MethodInvoker mi = new MethodInvoker(this.AutoAdjust);
while (true)
{ //在创建控件的基础句柄所在线程上异步执行指定的委托
this.BeginInvoke(mi);
//timer1.Enabled = true;
//timer1.Interval = 2000;
Application.DoEvents();
Thread.Sleep(1000);
}
}
catch (ThreadInterruptedException)
{
//针对具体问题定制异常抛出显示
}
finally
{
//做一些处理
}
} #endregion
{
byte[] data = new byte[255];
string[,] expData = null;
object[] tmpData = new object[34];
byte[] bytSendData = new byte[255]; try
{
bytSendData = CL3013.ReadStdMeterData();
data = comStdMeterPower.SendAndRecived(bytSendData);
if (data != null)
{
if (data[4].ToString("x2") == "50")
{
clsCLT1_1.AnsDatExplan(data, ref expData); Ua.Text = expData[0, 2];
Ub.Text = expData[0, 1];
Uc.Text = expData[0, 0];
Ia.Text = expData[0, 5];
Ib.Text = expData[0, 4];
Ic.Text = expData[0, 3];
PhiA.Text = expData[3, 2];
PhiB.Text = expData[3, 0];
PhiC.Text = expData[3, 0];
P.Text = expData[4, 3];
Q.Text = expData[4, 7];
S.Text = expData[5, 3];
txtUa.Text = Ua.Text;
txtIb1.Text = Ia.Text;
txtIb2.Text = Ib.Text;
txtP1.Text = expData[4, 2];
txtP2.Text = expData[4, 1]; double tmpUa = Convert.ToDouble(expData[0, 2]) * 10000;
double tmpIa = Convert.ToDouble(expData[0, 5]) * 1000000;
double tmpIb = Convert.ToDouble(expData[0, 5]) * 1000000;
double tmpPa = Convert.ToDouble(expData[4, 2]) * 1000000;
double tmpPb = Convert.ToDouble(expData[4, 1]) * 1000000;
UaValues = (int)tmpUa;
IaValues = (int)tmpIa;
IbValues = (int)tmpIb;
PaValues = (int)tmpPa;
PbValues = (int)tmpPb; }
else
{
structErrorMsg.Addlog(1, "返回的数据不符合协议要求!", txtMsg);
} }
else
{
structErrorMsg.Addlog(1, "没有返回数据!", txtMsg); } }
catch (Exception ex)
{
structErrorMsg.Addlog(1, "没有返回数据!错误原因:" + ex.ToString(), txtMsg);
}
}
{
lock (snyBark)
{
try
{
//参数输入的不合法
if (tmpByte == null || tmpByte.Length <= 0 || !this._isOpen) return null;
structErrorMsg.Addlog(2, clsComApp.Convert_ByteArray_HexString(tmpByte), txtMsg);
sp.Write(tmpByte, 0, tmpByte.Length);
Application.DoEvents();
Thread.Sleep(DelayTime); int count = sp.BytesToRead;
//缓冲区中没有数据
if (count == 0)
return null;
byte[] temp_Data = new byte[count];
int num = sp.Read(temp_Data, 0, count); for (int i = 0; i < count; i++)
{
temp_Data[i] = temp_Data[i];
}
Szclou.Cl1000at.Adjust.structErrorMsg.Addlog(1, Szclou.Cl1000at.Adjust.clsComApp.Convert_ByteArray_HexString(temp_Data), txtMsg);
return temp_Data;
}
catch
{
return null;
}
}
{//在创建控件的基础句柄所在线程上异步执行指定的委托
this.Invoke(mi);
//timer1.Enabled = true;
//timer1.Interval = 2000;
Application.DoEvents();
Thread.Sleep(100);
}将UpdataThread方法中的循环修改下,sleep也不要太长时间
我是很礼貌的提出源码,希望你们能帮我解决问题;我写的代码怎么啦,是有问题,才请教你们
我现在是在赶项目进度,解决问题是第一准则,没功夫遵循那么多规则);我见过牛B的人,但没见过你这么不懂礼貌的人;
你这么不把人家放在眼里,我想你在公司也得不到别人的尊重;如再发现有人不尊重别人,直接把你从本版剔除出去