我需要将串口通讯的接收放在另外的线程运行,避免界面假死。提高曝光率再发一条。

xlf1115 2013-08-06 04:30:12
我目前是直接使用SerialPort1组件在主进程进行通讯,感觉有点堵塞主界面。
在接收的时候界面一卡一卡的,尤其是计时器,停顿一会一次跳好几秒。
请各位大神教我怎么将SerialPort1的接收放在另外的线程。
连发两贴能解决的下面的贴也回回,多点给分。最好有个简单的例子
...全文
381 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2013-08-10
  • 打赏
  • 举报
回复
如果可以避免,那就是又回到你原来的状况:主线程停在那里等待结果,于是就有卡的现象。 你不能提出互相矛盾的要求,既要主线程不卡,又不想采用事件方式。 其实办法是有的,就是在等待的时候调用Application.DoEvents()让主线程消息继续工作。不过我觉得你还是应该学一下异步方式(事件消息方式)编程,就像托控件一样,不能总是只会这一招。
pengwu666 2013-08-10
  • 打赏
  • 举报
回复
引用 24 楼 jshi123 的回复:
拖控件也是自动生成这样的语句。为什么一定要拖控件?拖控件有什么优势吗? 线程里的程序都运行完,线程就结束了。 当然仍然可以用DataReceived事件,和是否在线程中没有关系。
你说的我弄好了不过,又1问题。我在其他线程读取, 主线程不管你读到没有就返回。有没有什么办法避免 我启动线程读取,然后比较。现在还没读到就先对比了
pengwu666 2013-08-10
  • 打赏
  • 举报
回复
引用 27 楼 jshi123 的回复:
如果可以避免,那就是又回到你原来的状况:主线程停在那里等待结果,于是就有卡的现象。 你不能提出互相矛盾的要求,既要主线程不卡,又不想采用事件方式。 其实办法是有的,就是在等待的时候调用Application.DoEvents()让主线程消息继续工作。不过我觉得你还是应该学一下异步方式(事件消息方式)编程,就像托控件一样,不能总是只会这一招。
虽然线程读取弄好了,不过好像也没打到我想要的目的。 我先去看看异步是什么。。。。不想结贴啊。结了你就不在了。。
xlf1115 2013-08-09
  • 打赏
  • 举报
回复
引用 5 楼 wuyazhe 的回复:
看下我以前写的先 http://blog.csdn.net/wuyazhe/article/category/695097
这个我都看了。有用。 不过不是我现在想要的。我是下个把接收放到线程。不想用事件
xlf1115 2013-08-09
  • 打赏
  • 举报
回复
引用 16 楼 jshi123 的回复:
[quote=引用 15 楼 xlf1115 的回复:] 线程里不可以用串口控件。。好像
谁说的[/quote] 可以教我么。我真没找到这个方法
足球中国 2013-08-09
  • 打赏
  • 举报
回复
这伙计基础知识真差,是不是只学了c#。操作系统的东西一点没学。
jshi123 2013-08-09
  • 打赏
  • 举报
回复
你现在的代码怎么写的?使用串口的方式是怎么样的?
jshi123 2013-08-09
  • 打赏
  • 举报
回复
拖控件也是自动生成这样的语句。为什么一定要拖控件?拖控件有什么优势吗? 线程里的程序都运行完,线程就结束了。 当然仍然可以用DataReceived事件,和是否在线程中没有关系。
pengwu666 2013-08-09
  • 打赏
  • 举报
回复
引用 22 楼 jshi123 的回复:
那就把串口操作放到线程中去: public static void ThreadProc() {
你这个是new SerialPort,不是拖的控件。拖的控件不可以这样对吗。 启动线程 用完需要关闭吗 如果像你这样线程是不是不可以用事件了
jshi123 2013-08-09
  • 打赏
  • 举报
回复
那就把串口操作放到线程中去: public static void ThreadProc() { var serialPort = new SerialPort("com1", 11500); serialPort.Open(); serialPort.WriteLine("xxxxx"); var s = serialPort.ReadLine(); 。。。。 serialPort.Close(); } 然后启动线程: Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start();
pengwu666 2013-08-09
  • 打赏
  • 举报
回复
就算我用DataReceived事件。如果用SerialPort.readline 也会卡死界面。 因为我要用到接收超时设置,所以必须要用SerialPort.readline
pengwu666 2013-08-09
  • 打赏
  • 举报
回复
引用 19 楼 jshi123 的回复:
你现在的代码怎么写的?使用串口的方式是怎么样的?
我主界面拖了几个SerialPort组件。在类模块写了1个发送函数里面用form1.SerialPort.WriteLine 还有一个接收函数用的form1.SerialPort.readline 我是想把这个接收函数放在另外运行。因为会卡界面。
xlf1115 2013-08-08
  • 打赏
  • 举报
回复
用事像是很简单。但是我觉得有的时候不需要返回。需要返回在返回。这样实时返回我不大好处理。 还没休息啊。这么晚感谢件接收好你还帮我回帖
引用 11 楼 jshi123 的回复:
用DataReceived就是在另外的线程中处理,不会卡主界面 [quote=引用] 从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,请使用 Invoke 回发更改请求,这将在正确的线程上执行。
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived(v=vs.90).aspx 这个链接里有简单的例子[/quote] 用事像是很简单。但是我觉得有的时候不需要返回。需要返回在返回。这样实时返回我不大好处理。 还没休息啊。这么晚感谢件接收好你还帮我回帖
xlf1115 2013-08-08
  • 打赏
  • 举报
回复
引用 6 楼 LLQi1988 的回复:
 '委托
    Delegate Sub mydg()
    '接收数据
    Private Sub SerialPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

        Try

            Dim dg As mydg = AddressOf Read

            dg.Invoke()
        Catch ex As Exception

        Finally

        End Try
    End Sub
都是用的DataReceived接收的吗
jshi123 2013-08-08
  • 打赏
  • 举报
回复
用DataReceived就是在另外的线程中处理,不会卡主界面
引用
从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,请使用 Invoke 回发更改请求,这将在正确的线程上执行。
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived(v=vs.90).aspx 这个链接里有简单的例子
jshi123 2013-08-08
  • 打赏
  • 举报
回复
引用 15 楼 xlf1115 的回复:
线程里不可以用串口控件。。好像
谁说的
xlf1115 2013-08-08
  • 打赏
  • 举报
回复
引用 14 楼 jshi123 的回复:
不用DataReceived也可以,定义一个方法: public static void ThreadProc() { 把串口操作的东西都放到这里 } 然后用线程来执行它: Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); 看msdn的例子
线程里不可以用串口控件。。好像
jshi123 2013-08-08
  • 打赏
  • 举报
回复
不用DataReceived也可以,定义一个方法: public static void ThreadProc() { 把串口操作的东西都放到这里 } 然后用线程来执行它: Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); 看msdn的例子
xlf1115 2013-08-07
  • 打赏
  • 举报
回复
引用 9 楼 sjyforg 的回复:
[quote=引用 8 楼 pengwu666 的回复:] [quote=引用 7 楼 sjyforg 的回复:] 你是用的DataReceived的事件处理数据接收的吗? 你的代码是怎么写的?
不是的 我用的readline接收[/quote] 那建议你用DataReceived事件。[/quote] 这个我知道,不过我不需要时刻都接收返回。所以用的readline没有用接收事件
兔子-顾问 2013-08-07
  • 打赏
  • 举报
回复
加载更多回复(8)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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