正在做一个基于串口通信的调试配置程序,因为是第一次用多线程,所以有很多问题想请教一下,下面我先描述一下我这个程序的一些基本情况。
1、主线程即程序的主界面,作基于图形的配置管理。
2、另一线程专门接收通信桢,在此线程中分析判断通信桢并组成一个完整的通信命令。
3、在配置程序中发送到服务端的命令全部加入到一个命令队列中,并依次发送,需要接受到发送返回后才发送下一个命令(在此作了超时处理)
4、通信采用一问一答的方式。说一个具体点儿的实际情况:
比如我在主界面中点击某个按钮(获取服务器端的所有端口信息),首先是把这个命令发送到命令队列中,然后在队列中取出一个命令通过串口发送,由服务方收到命令后通过协议解析返回结果,这时客户端线程在解析并组成一个完整的结果,后面我就不知道该怎样处理了,在此我有很多的疑问,
1、应该由谁来处理显示接收到的结果?
2、由于返回的结果不一定在某个特定的VCL组件中显示,如果由接收线程通过同步来处理显示结果, 它怎么知道该把结果显示在那个地方?
3、如果由主线程来处理显示,它什么时候知道有数据返回了,它不可能一直在那里等待阻塞啊?
3、如果在接受线程同步时,关闭了应该显示结果的窗口,又会如何?需要各位帮忙解答一下,在此万分感谢!!!

解决方案 »

  1.   

    to: jinjazz(近身剪(N-P攻略)) 
    协议解析这部分我就是用纯C封装的一个DLL,里面就定义了一个回调函数,然后在应用这边实现这个回调函数进行相关的操作。因为我第一次用线程,所以我对应用这边的时序管理不是很清楚,也就是什么时候该把取到的数据显示在界面等等。
      

  2.   

    你是不是原来用VC出身的?问关于界面什么时候Update的这样的问题?
      

  3.   

    楼主问的好象就是多线程与VCL的同步的问题呀。关于这个有几种解决的方法。
    首先要知道线程与VCL的同步其实是有主线程完成的。
    对VCL的访问只能在主线程中。这将意味着:所有需要与用户打交道的
    代码都只能在主线程的环境中执行。这是其结构上明显的不足,并且这种需求看起来只局限在表面上,
    但它实际上有一些优点。
    首先,只有一个线程能够访问用户界面,这减少了编程的复杂性。Wi n 3 2要求每个创建窗口的线
    程都要使用GetMessage( )建立自己的消息循环。正如你所想的,这样的程序将会非常难于调试,因为
    消息的来源实在太多了。
    其次,由于VCL只用一个线程来访问它,那些用于把线程同步的代码就可以省略了,从而改善了
    应用程序的性能。
    Synchronize()方法
    在TThread中有一个方法叫Synchronize(),通过它可以让线程的一些方法在主线程中执行。当你在程序中第一次创建一个附属线程时,VCL将会从主线程环境中创建和维护一个隐含的线程
    窗口。此窗口唯一的目的是把通过Synchronize()调用的方法排队。
    S synchronize()把由Method参数传递过来的方法保存在TThread的FMethod字段中,然后,给线程窗
    口发一个CM_EXECPROC消息,并且把消息的lParam参数设为self(这里指线程对象)。当线程窗口的窗
    口过程收到这个消息后,它就调用FMethod字段所指定的方法。由于线程窗口是在主线程内创建的,
    线程窗口的窗口过程也将被主线程执行。因此,FMethod字段所指定的方法就在主线程内执行。用消息来同步
    可以利用在线程之间使用消息同步以替代T Thread.Synchronize()方法。可以使用API函数
    SendMessage()或PostMessage()来发送消息。这是与CVL的同步,还有线程之间的同步有以下的办法:
    临界区
    互斥
    信号量这是我从书上帮你COPY下来的,看看对你有没有帮助。