简单的线程问题!

gaoxing_1985007 2010-11-09 10:07:14
唉,又是串口和线程。
是这样的:
WinForm程序。
用线程来扫描串口。
创建一个线程,当串口有数据时,线程执行,来处理串口中的数据。然后线程停止。
当串口又接受到数据时,线程继续执行,来处理串口中的数据。
处理串口数据的方法是个死循环,一直在执行。


private void Form1_Load(object sender,EventArgs)
{
//设置串口和波特率
}

public void testMain() //处理串口数据的方法
{
while(true)
{
//处理串口数据
}
//线程停止
}

private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
//获取串口数据
//线程执行
}


问题:大体思路是这样的,现在我不太清楚,线程该创建在什么地方,该如何控制才能完成以上的功能?
...全文
229 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chinaxjdyh 2010-11-13
  • 打赏
  • 举报
回复
关注一下~~~
乱世狂刀 2010-11-13
  • 打赏
  • 举报
回复
3.



SerialPort serialPort = null;

private void Form1_Load(object sender,EventArgs)
{
//设置串口和波特率
if(object.equals(serialPort, null))
{
serialPort = new SerialPort();
}
}

public void testMain() //处理串口数据的方法
{
while(true)
{
//处理串口数据
}
//线程停止
}

private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
int _length = serialPort1.BytesToRead;
byte[] _byte = new byte[_length];
int _intResult = serialPort1.Read(_byte, 0x00, _length);
string serialData = System.Text.Encoding.Default.GetString(_byte);
this.Invoke(new Action(() => { serialData}));
}


你要是仍然不明白的话 就联系下我 我给你再介绍下
乱世狂刀 2010-11-13
  • 打赏
  • 举报
回复
1.你需要以this.invoke()的方法调用不安全方法来处理缓存数据和 UI的交互
乱世狂刀 2010-11-13
  • 打赏
  • 举报
回复
1.DataReceived 事件工作在辅助线程
兔子-顾问 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gaoxing_1985007 的回复:]
在serialPort1_DataReceived事件中处理,出现了这样的问题:
跨执行绪作业无效,存取控制项richTextBox时所使用的执行绪与建立控制项的执行绪不同。
(我在richTextBox中显示处理串口数据的一些信息)


引用 6 楼 bloodish 的回复:
无需线程,直接在serialPort1_DataReceived事件中处理即可.
PC机的数据处理能力远……
[/Quote]

DataReceived中访问ui需要调用Invoke
例如
this.Invoke((EventHandler)delegate
{
//访问ui资源的代码
});
gaoxing_1985007 2010-11-11
  • 打赏
  • 举报
回复
哥,你的头像太恐怖了吧。
[Quote=引用 14 楼 mjp1234airen4385 的回复:]
托管了吧。
[/Quote]
mjp1234airen4385 2010-11-11
  • 打赏
  • 举报
回复
托管了吧。
zhubo006 2010-11-11
  • 打赏
  • 举报
回复
bloodish 2010-11-11
  • 打赏
  • 举报
回复
你是想往RichTextBox里将一些字符串?
DataReceived其实是另外一个线程,在另一个线程直接操作UI线程创建的控件是不允许的,做一个Invoke操作.


RichTextBox rtb = new RichTextBox();
string msg = "hello world";
this.Invoke(new Action(() => { rtb.AppendText(msg); }));
gaoxing_1985007 2010-11-10
  • 打赏
  • 举报
回复
在serialPort1_DataReceived事件中处理,出现了这样的问题:
跨执行绪作业无效,存取控制项richTextBox时所使用的执行绪与建立控制项的执行绪不同。
(我在richTextBox中显示处理串口数据的一些信息)

[Quote=引用 6 楼 bloodish 的回复:]
无需线程,直接在serialPort1_DataReceived事件中处理即可.
PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.

如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
[/Quote]
yudeli 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bloodish 的回复:]
无需线程,直接在serialPort1_DataReceived事件中处理即可.
PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.

如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
[/Quote]
zy0113 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bloodish 的回复:]
无需线程,直接在serialPort1_DataReceived事件中处理即可.
PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.

如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
[/Quote]

bloodish 2010-11-10
  • 打赏
  • 举报
回复
无需线程,直接在serialPort1_DataReceived事件中处理即可.
PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.

如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
兔子-顾问 2010-11-10
  • 打赏
  • 举报
回复
不用你创建,而且内部是中断沟不是死循环。
gaoxing_1985007 2010-11-10
  • 打赏
  • 举报
回复
mscomm这个不用创建监听线程吗?
[Quote=引用 3 楼 wuyazhe 的回复:]
vc如果不用mscomm32.ocx,都要自己创建监听线程的。你不能照搬c++那套来c#的。直接用SerialPort的DataReceived事件,接收,缓存数据。然后判断数据是否完整是否正确。分析就可以了。
[/Quote]
Im_pirate 2010-11-10
  • 打赏
  • 举报
回复
70778248,C# 学习交流群,欢迎各路高手加入
兔子-顾问 2010-11-09
  • 打赏
  • 举报
回复
vc如果不用mscomm32.ocx,都要自己创建监听线程的。你不能照搬c++那套来c#的。直接用SerialPort的DataReceived事件,接收,缓存数据。然后判断数据是否完整是否正确。分析就可以了。
如一宝宝 2010-11-09
  • 打赏
  • 举报
回复
你这里得弄两个线程吧,一个用于接受,一个用于处理;

接受的线程可以把数据保存在一个集合中,处理线程从集合中取出数据并加以处理;

这里建议用队列吧,先进先出!

记得你的两个线程工作完后得sleep下!
ZengHD 2010-11-09
  • 打赏
  • 举报
回复
不需要死循环吧,每次DataReceived接收到数据,就开一个线程,处理完就退出线程

111,129

社区成员

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

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

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