C#如何处理在辅助线程里面接收到的数据呢?
我现在使用SerialPort控件接收从串口过来的数据,使用的是SerialPort的DataReceived,DataReceived是在辅助线程里面的,现在的情况是可...
我现在使用SerialPort控件接收从串口过来的数据,使用的是SerialPort的DataReceived,DataReceived是在辅助线程里面的,现在的情况是可以正常的接收到这些数据了,但是,不知道该如何把这些接收到的数据在主线程中实时处理。
以前都没有接触过C#,我现在的想法是,使用消息队列,在接收到数据后,把这些接收到的数据放入队列里面,然后发送出去,而处理这些数据的程序则是一直在等待这个消息队列的到来,(以前只接触过C和uCOS,uCOS是可以这样处理的)。
不知道C#是否也可以这样子做,如果的话,应该怎么做呢?因为我看到C#里面有个PostMessage,所以我才有了上面的想法。
如果上面的想法是错,请问应该怎么做好呢? 展开
以前都没有接触过C#,我现在的想法是,使用消息队列,在接收到数据后,把这些接收到的数据放入队列里面,然后发送出去,而处理这些数据的程序则是一直在等待这个消息队列的到来,(以前只接触过C和uCOS,uCOS是可以这样处理的)。
不知道C#是否也可以这样子做,如果的话,应该怎么做呢?因为我看到C#里面有个PostMessage,所以我才有了上面的想法。
如果上面的想法是错,请问应该怎么做好呢? 展开
2个回答
展开全部
放到队列里,然后主线程轮询读取即可。不通的线程访问同一资源记得加锁。
比如你要DataReceived的数据(字符串)显示到界面的TextBox上,
那可以如此:
private StringBuilder sb = new StringBuilder();
====DataReceived事件(string data):
lock(sb){
sb.append(data);
}
====界面上可以用Timer来刷新:
string str = "";
lock(sb){
str = sb.tostring();
sb.clear();
}
txtbox.append(str);
第一个事件是串口的线程
第二个是UI线程(也就是主线程了)
比如你要DataReceived的数据(字符串)显示到界面的TextBox上,
那可以如此:
private StringBuilder sb = new StringBuilder();
====DataReceived事件(string data):
lock(sb){
sb.append(data);
}
====界面上可以用Timer来刷新:
string str = "";
lock(sb){
str = sb.tostring();
sb.clear();
}
txtbox.append(str);
第一个事件是串口的线程
第二个是UI线程(也就是主线程了)
更多追问追答
追问
那些数据最少会有以下的处理:
1、这些数据需要进行校验,如果校验通过,认为这些数据是有效的。
2、如果数据是有效的,把这些数据保存起来,文本保存或是其它格式保存。
3、提取数据里面的信息。
4、对提取出来的信息进行各种处理
我自己已经是用定时器实现了,但用定时器实现的方法感觉没有使用消息队列的好
追答
你所谓的消息队列是系统自带的那个吗?——那你还不如用定时器。
你用系统自带的那个消息队列,等于是进程间通信了,肯定没有你同一进程内处理的好啦。
你提出的1234点,都不会有什么问题。
但是如果你只是验证数据,保存数据,但是并没有涉及到UI的话,都可以在DataReceived里面处理(或者传给相关的函数)即可。意思就是用串口的那个线程处理。
要显示到界面的数据才跟UI做临界资源锁。
就是,“本来就不在主线程的,并且能不用主线程做逻辑处理的尽量不要用主线程。”
程序的消息循环就在UI上,你做耗时处理弄界面卡就很不友好了。
另外,我也支持楼上的写法。
展开全部
如果只是显示数据, 可以在 DataReceived 里调用下面的方法:
string strRead= comPort.ReadLine();
ShowInfo(strRead);
private void ShowInfo(string msg)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(ShowInfo), msg);
}
else
{
ListBox1.Items.Add(msg);
}
}
string strRead= comPort.ReadLine();
ShowInfo(strRead);
private void ShowInfo(string msg)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(ShowInfo), msg);
}
else
{
ListBox1.Items.Add(msg);
}
}
追问
不是的,那些数据最少会有以下的处理:
1、这些数据需要进行校验,如果校验通过,认为这些数据是有效的。
2、如果数据是有效的,把这些数据保存起来,文本保存或是其它格式保存。
3、提取数据里面的信息。
4、对提取出来的信息进行各种处理
追答
那就在 DataReceived 事件方法里进行处理:
string strRead= comPort.ReadLine();
// 处理 code
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询