哪位知道,我在做三层MIS时,CLIENT请求服务层时,CLIENT是创建线程的请求服务,服务层也是创建线程提供服务,可是CLIENT运行请求时报错说“应用程序调用的方法正在为另一个线程调整的界面”,为什么啊? 
但是我请求服务的代码如果在主线程中执行有可以。但这样创建线程就没意义了。

解决方案 »

  1.   

    你的三层用的什么组件?试着用VC或C++BUILDER来做客户端呢?
      

  2.   

    三层的客户端怎么还要用多线程?AppServer端用多线程是必须的,客户端做多线程好像没有必要吧。
    难道你的客户端还会并发的执行多个事务吗?对于客户端来说越是简单越好,如果你真的要这样做,可能要把另外一个分配客户端线程的接口系统,他可以对多线程的客户端的业务线程进行分配Appsever的处理线程。这样就不会出现瓶颈现象,其实你提出的模式很好,但是三层架构的目的就是要把客户端变瘦的。
      

  3.   

    自己创业 
      “他可以对多线程的客户端的业务线程进行分配Appsever的处理线程。”怎么分配,给个简单例子行吗?
      

  4.   

    主要是线程同步的问题,多个线程同时调用一个AppServer当然会有问题,你可以在每个线程中创建一个单独的SocketConnection。说实在话客户端使用多线程连服务器对系统应该没有太大的好处,特别是效率方面可能根你期待会有差距,更增加了服务器端的负载。
      

  5.   

    客户端要做多线程的话,SocketConnection要封装到线程里去,这样在每次客户端向中间层发送连接请求后都会分配不同的线程给客户端,也就是多,客户端在中间服务层有多个线程为该客户端服务。就不存在冲突。目前我所做的系统就是这样,运行的很稳定
      

  6.   

    说得不清楚,不知道你是用TSocketConnection还是TDCOMConnection?
      

  7.   

    by the way,我一般都是两种都用的,可以做异步处理。运行的也很稳定,瘦客户端很小。
      

  8.   

    问题已解决,但是我想问CLIENT请求中间层进行复杂查询,中间层是创建线程提供查询的,可是CLIENT如何知道中间层查询结束了? 
     
      

  9.   

    线程同步的问题,线程中访问VCL是要放到住线程中去的。
      

  10.   

    呵呵,这就是消息机制的问题,你需要定义好消息包的格式,进行Tcp/IP的通讯你肯定会有数据的交互信息的,这个信息可以定义为一个消息包,包的格式需要根据你的需要进行定义,
    Client端请求数据查询业务,发消息到AppServer,AppServer处理好以后也要会消息,这个消息的格式也是你定义,或者你可以用统一的包格式,返回消息中你可以定义业务逻辑处理的结果,如果是错误的你可以返回错误编号和错误消息,如果是正确的你可以返回正确的编号以及业务逻辑处理结果信息,这些及时包的格式中定义的各个结构信息而已。能够通信了事情不会很难做了,这一步实现了你就实现了TCP/IP数据包交互的事情了