C# 多线程问题

jsn6314113 2010-08-06 03:29:51
PS:本人新手最近在做C#多线程方面的内容遇到如下问题,求解答,谢谢!
情况是这样的:
两个进程,主进程等待串口传送过来是数据,然后把未来得及处理的数据插入队列,
还有一个进程专门处理队列,从队列中把未来得及处理的数据写入数据库,同时显示在form上的ListBox上,由于涉及到线程修改控件,这一块不懂,特发帖求助。
主要问题是不是到在什么地方触发第二线程进行数据处理,如何控制第二线程在队列为空的时刻进入侦听状态,在队列中有新数据插入时,再对数据进行处理。
(希望各位大侠,能给小弟一些帮助,代码示例最好,谢谢)
...全文
1251 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
神琨 2012-10-20
  • 打赏
  • 举报
回复
我也需要,一个线程从串口读取数据,存入一个queue,另一个线程从queue中读取数据并分析数据
有代码吗,弄了好几天了也没弄出头绪来
kenday 2012-01-30
  • 打赏
  • 举报
回复
hljlpz 2010-08-07
  • 打赏
  • 举报
回复
楼上代码是错误的
线程二每次都会waitone,但线程一可能在现成二未到达waitone时多次执行
线程二可以判断队列是否为空,如果为空sleep(10)然后contiune
Mars.xj 2010-08-06
  • 打赏
  • 举报
回复
线程一接收数据,线程二处理数据

ManualResetEvent resetevent=new ManualResetEvent(false)

线程一
{
接收到数据并放入队列

resetevent.set();//通知线程二有数据存入队列,开始处理
}

线程二
{
while(true)//循环判断队列中数据是否已处理完毕
{
如果队列中无数据
{
resetevent.reset();
resetevent.waitone();
//这两句意思为,如果队列中数据已处理完,挂起线程,等待新的数据传入通知
}
如果队列中有数据
{
处理数据
}
}
}
liuh6 2010-08-06
  • 打赏
  • 举报
回复
分线程A执行方法

if(queueList.count>你设定一下队列最大数&&B线程没在运行时)
   启动B线程
else
A线程自已处理


分线程B的执行方法
{
if(queuqlist.count<你设定一下队列最大数)
{
停止B线程
}else

{
处理数据
}

}
jsn6314113 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 liuh6 的回复:]
看到你的问题,感觉你逻辑设计有问题...
你的串口数据量大,主线程操作部分数据,操作不完的扔给队列,让分线程操作..这样我感觉对程序线程的分工不明确,如主线程处理的数据量复杂的情况下,程序运行时间长,还有可能造成你接收数据的丢失..


建议:主线程就是做数据接收工作..收到数据加入队列,这样可以节省处理数据的时间,更进一步的做到接收完整的数据.
开分线程,一个或两个线程专门去处理,或分……
[/Quote]

你说得思路也就是我想的思路,其实我现在最主要的目的是在我实际程序中遇到问题,希望能找个类似代码参考一下。谢谢
liuh6 2010-08-06
  • 打赏
  • 举报
回复
看到你的问题,感觉你逻辑设计有问题...
你的串口数据量大,主线程操作部分数据,操作不完的扔给队列,让分线程操作..这样我感觉对程序线程的分工不明确,如主线程处理的数据量复杂的情况下,程序运行时间长,还有可能造成你接收数据的丢失..


建议:主线程就是做数据接收工作..收到数据加入队列,这样可以节省处理数据的时间,更进一步的做到接收完整的数据.
开分线程,一个或两个线程专门去处理,或分析数据.把队列加上临界点就可以!~

这样你的问题也随之解决了!
Neil198 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jsn6314113 的回复:]
Neil198 不行啊 串口传来是字符串是二进制 我要将它转成十六进制 和数据库的数据对应起来 因为接下来的步骤还需要将表中数据合并查询。
[/Quote]
2 to 16 + Update没多久吧?

两个进程,主进程等待串口传送过来是数据,然后把未来得及处理的数据插入队列,(主进线程及负责接受数据还负责处理?)
还有一个进程专门处理队列,从队列中把未来得及处理的数据写入数据库(另一个线程也要处理数据还要负责插入数据库?) 没太明白你的处理方式,你把任务都堆在队列里面如果有一条任务错误,程序异常后面的任务去哪里找去?

如果你认为 2 to 16 update 也耗时的话那就线程1接收数据,接收完成以后创建另外一个线程进行数据转换,插入。 然后在起一个线程进行处理,这个线程跟接收的业务是分开的。 串口给你发数据过来你不需要回写么??串口另一端的设备不管你这边什么状态都一直发送?它怎么知道你收没收到?? 以前做过POS机是串口过来数据后PC先回写一条信息,告诉他接收成功,或者PC请求POS,POS机也会回写数据的。
qtempp 2010-08-06
  • 打赏
  • 举报
回复
我也是来学习地
叫我三三 2010-08-06
  • 打赏
  • 举报
回复
我是来学习地
jsn6314113 2010-08-06
  • 打赏
  • 举报
回复
Neil198 不行啊 串口传来是字符串是二进制 我要将它转成十六进制 和数据库的数据对应起来 因为接下来的步骤还需要将表中数据合并查询。
Neil198 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jsn6314113 的回复:]
Neil198 你好 由于数据是串口传送回来的 只需要几十毫秒就可能有新数据进来,所以线程1一定要时刻准备接受串口传来的数据。所以只有通过队列存储来不及处理的程序,线程2去处理。
[/Quote]
我的意思是线程1的任务就是接受数据插入数据库。其他不做任何操作。
线程2扫数据库,从数据库内获取任务并处理。
这样从业务上也是分开的降低耦合性。
jsn6314113 2010-08-06
  • 打赏
  • 举报
回复
sgchen2000 你好 可以给些示例的代码嘛?

PS:我的队列是调用一个公共类,不再Form里面。
jsn6314113 2010-08-06
  • 打赏
  • 举报
回复
Neil198 你好 由于数据是串口传送回来的 只需要几十毫秒就可能有新数据进来,所以线程1一定要时刻准备接受串口传来的数据。所以只有通过队列存储来不及处理的程序,线程2去处理。
jsn6314113 2010-08-06
  • 打赏
  • 举报
回复
理论上的思路已经明确了,谁可以写点代码给我看下吗?
mafgm 你好 可以写些代码给我参考下嘛?
luyexinzong 你好 这个异步委托我已经参考其他的资源写好了,目前主要问题就是线程的控制RT。
honkerhero 你好 我刚接触多线程,以前没学过,线程池就更加没听过了,目前指向解决如何去控制好第二线程。

顶起……

sgchen 2010-08-06
  • 打赏
  • 举报
回复
一般不会重复创建线程,第二进程循环监测队列是否为空,如果有东西就处理,没东西就sleep(100)。
Neil198 2010-08-06
  • 打赏
  • 举报
回复
进程!=线程


两个线程不分主次,分别称为线程1,线程2. 你的线程1把数据(以下称为任务)插入队列,线程2还要处理队列还要把没有处理的写入数据库然后在处理? 干嘛不让线程1负责接收数据然后存入数据库,加入时间戳字段,状态字段,任务号等。线程2负责从数据库获取任务并处理,处理后修改数据库状态。

线程修改控件使用委托,用Invoke,具体的可以google一下
honkerhero 2010-08-06
  • 打赏
  • 举报
回复
如果你的队列在逻辑上可以交给系统来控制的话,我的意思是说,你的队列仅仅是任务的排队,而不需要再过盛其他逻辑,可以考虑用线程池,把进来的任务直接扔到线程池的工作任务队列中,自己不手动维护,这样你就不可不必关注第二个线程的处理了,线程池会帮你处理。

你只要用第一个线程监听传来的数据,封装成线程池需要的任务类型,Enqueue即可。
luyexinzong 2010-08-06
  • 打赏
  • 举报
回复
线程修改控件时,需要将修改控件的代码返还到创建控件的线程执行,你可以用委托和Invoke,或者直接用组件。这个网络有很多资源!
mafgm 2010-08-06
  • 打赏
  • 举报
回复
那就给你的队列写一个插入触发事件,当新数据插入时,触发执行线程
加载更多回复(3)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧