日期:2014-05-17  浏览次数:20753 次

c# 多线程使用多年,今天算是栽了,高手请进
小弟做一个软件,c#多线程的,一个主线程,处理用户的点击操作,一个辅助线程处理串口送来的数据,用户点击一个按钮,后我发送一些数据出去,下位机返回一些对应的数据,如果收到数据就把一个全局变量 byte mark赋值为0x01;我在按钮的功能函数中睡眠一小会,确保数据已经发送完成,但是,遇到了奇怪的问题,明明数据发送来了,mark赋值操作已经在辅助线程中进行了,但是主线程中的mark依然是老数据(初始赋值0x03),不论你sleep多久。后来吧mark 前面加了修饰符 static,还有volatile,等,均无效;但是偶尔一次,我在主线程中加入了以messbox.show函数,发现数据成功更新,正常了,我晕倒了,这是什么情况,大侠给解释下,总不能总是给弹出对话框吧
send_data(send_buffer, 9);
                Thread.Sleep(500);
                while(mark_02==0x03 && count++ < 3)
                {
                    Thread.Sleep(100);                   
                }
                MessageBox.Show("asd");//不加这两行就是老数据,加了就是新数据
                MessageBox.Show("asd");
                if (mark_02 == 0x01)
                {
                    MessageBox.Show("ok");
                    break;
                }

------解决方案--------------------
可能是数据太快了....

就这和其他人经常问的一个问题:设断点就没事,不设断点就有问题。
因为设断点和MessageBox一样,让程序等一段时间才执行下面的代码
------解决方案--------------------
你何必用Thread.Sleep(100)呢,用委托不是很好,你这样,万一数据就是没过来怎么办,委托吧,多年的多线程经验,不应该用怎么笨的方法来判断数据是否回执吧~~~
------解决方案--------------------
如果真的和messagebox有关的话。。。也许doevent一下就行?
------解决方案--------------------
你的发送和接收是分开处理的么,接收用委托来处理
------解决方案--------------------
多年的瞎拼瞎凑经验。建议上个学,重新构筑你的编程技能。
------解决方案--------------------
硬要说这里的问题,那就拆开检查
你循环体的参数重设一下,你这样只会增加不稳定的因素
------解决方案--------------------
引用:
引用:多年的瞎拼瞎凑经验。建议上个学,重新构筑你的编程技能。先给分析问题吧
mark_02在哪定义的?
将thread.sleep(TIME)延长点时间试试
------解决方案--------------------
多线程操作加锁吧。。
用lock

------解决方案--------------------
接受开个线程,有数据然后委托事件通知界面主线程处理,sleep什么啊,你知道消息什么时候能回来?
------解决方案--------------------
哦,对还有Invoke,这个用起来比较简单,实用。
------解决方案--------------------
引用:
引用:多年的瞎拼瞎凑经验。建议上个学,重新构筑你的编程技能。先给分析问题吧

这个问题很好分析,从你描述的现象看,你的主线程被占用的情况下数据无法更新,所以你应该找找更新数据的地方和主线程是什么关系,一定是使用了Invoke调用主线程更新。另外MessageBox里面会做DoEvent(),这时主线程的消息泵会处理,所以你才会有机会更新数据。