现在面临个问题,就是两个线程分别通过两个串口来读取数据,读取完数据后,处理数据采用同一个函数的话,采用参数来判定是哪个线程,分别存储,然后再把两个串口存储的数据结合起来,输出。不知道这种处理存在线程互斥和同步的问题不?数据还是有点问题的,谢谢各位大侠。
解决方案 »
- winform怎么实现一个新窗体修改项,本窗体马上更改呢?
- Dataset转Excel遇到的问题
- 菜鸟问题:.net生成的DLL文件找不见怎么办。
- C# SqlParameter 能用在SQl语句:select top 2 id from ArticleInfo 中的“2”吗
- C# WINDOWS程序 怎么做成dll
- 请问定义DataRow是这样定义的吗?
- 【请教】网络化数字视频监控系统设计与实现
- 参数化是否可以绝对防止注入?
- Socket网络编程,服务端监听的问题。
- 字节数组如何相加????
- access和sqlserver数据库中的数据怎么导入到一张excel表中
- aspx页面不完全支持js脚本???求大侠指点了,小弟感激不尽啊!!!!
// 开头需加入using System.Threading
// VS2008 编译通过
//
static int a;
static int b; static void Main()
{
Thread th1 = new Thread(Doo);
Thread th2 = new Thread(Doo);
Console.WriteLine("开始多线程操作");
th1.Start(1);
th2.Start(2); th1.Join();
th2.Join();
Console.WriteLine("操作完成");
Console.WriteLine("结果" + (a + b));
} static void Doo(object obj)
{
if (obj is int && (int)obj == 1)
{
Console.WriteLine("正在操作类型1");
Thread.Sleep(1000);
a = 18;
}
else
{ Console.WriteLine("正在操作类型2");
Thread.Sleep(400);
b = 20;
}
}
数据填错了,你最好加断点仔细调试下,八成你的问题。记得加锁,各锁各的缓冲区,别死锁了
private void DoSubMainChuTrim()
{
int chunnelCod = (int)(this._subMainRecBytes[_state_chu_cod] - 0x01);
// 报文有误
if (Super.Validate.ValidateChunnelCod(chunnelCod) == false)
{
return;
}
// {
Chunnel chunnel = DataBase.chunnels[chunnelCod];
lock (chunnel)
// Monitor.Enter(chunnel);
{
chunnel.SubMainNum= this._subMainRecBytes[_state_length] - 0x06;
chunnel.SubMainNum /= 0x04;
// 报文有误
if (Super.Validate.ValidateProbeNum(chunnel.SubMainNum) == false)
{
return;
}
chunnel.Status = true;
Probe probe;
// waveData
Byte[] blist = new Byte[4];
for (int i = 0; i < chunnel.SubMainNum; ++i)
{
probe = chunnel.Probes[i+chunnel.Num];
blist[3] = _wave_first_byte;
blist[2] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x00];
blist[1] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x01];
blist[0] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x02];
probe.Wave = BitConverter.ToSingle(blist, 0);
probe.Atten = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x03] * (-1);
}
chunnel.Num += chunnel.SubMainNum;
} //Monitor.Exit(chunnel);
}