我和下位机的通信是实时的,平均是300毫秒一次,有时候要在在串口接收数据的事件里面,跳出一个MessageBox,然用户进行选择,因为这个过程会耗时的,但是串口又会接收数据,会导致程序出错,该怎么样解决这个问题呢?

解决方案 »

  1.   

    将你接收到的数据都存到一个list列表中,然后你循环处理list中的数据,不要接到一个就box一个,没这么干的
      

  2.   

    哥有道理啊,呵呵,用TimeProc好还是Timer好呢?
      

  3.   

    和串口通信的用个线程吧,线程用消息通知主线程,定时用TIMER就好了
      

  4.   

        2楼说的是比较有理,不过你真的要有个提示也不是不行。不过你最好用个标记把两种数据分开。
        只要创那一个一次执行的线程,在线程里面写messagebox就可以了,不过那不能太多个,你一下跳太多了系统可能支持不过来,不过好的电脑可能会好点,我用的是一台单核的老机子了所以发太多的时候会提示线程接收不过来,但只要把窗体最小化再显示出来就可以了!
        希望对你有帮助!
      

  5.   

    在有messagebox弹出时,在窗口通讯事件里开始判断一下,直接退出,只有软件未弹出提示时,才继续。例如通讯事件开始的第一句话写:if FindWindow(0,'你的messagebox的标题')>0 then exit;
      

  6.   

    接收数据和处理数据是一定要分开的,
    另外不喜欢Spcomm,接收数据方式很不喜欢,如果你的应用就是单对单的,用它也还凑合,如果是单对多的还是用CPORT更好
      

  7.   

    用非模态窗口代替messagebox可以吗?
      

  8.   

    可不可以不用Box而采用计数、报警之类的
      

  9.   

    因为要进行和工人对话操作之类的,所以要BOX的,对了,再问个问题,怎么样改变底部状态栏的颜色,或者改变其中一列,可以吗?貌似不好办
      

  10.   

    弄个listview把你接受的数据放到里面,让用户来处理,要不你就不要用模式对话框,这样消息堵塞了
      

  11.   

    和下位机的通信用个线程,主线程和通信线程用事件同步交互。通信线程的Execute方法中:
    ......
    WaitForSingleObject(aEvent,INFINITE);//aEvent同步事件对象
    ...
    ....//这儿是通信处理
    ....
    PostMessage();主线程的消息处理方法中:
    .....
    case theMessage.wParam of 
    1://假设这个标志要进行选择
    begin
      ResetEvent(aEvent);//挂起线程
      if Application.MessageBox() = XXX then
      begin
        ...
      end
      SetEvent(aEvent);//恢复线程
    end
    2:
    3:end用类似的同步事件方法来进行控制。这里提醒下,不要用线程本身的Suspended和Resume来挂起和恢复,在window下不可靠