ClientSocket OnRead接受消息时按照指令解析所做的操作
Socket工作在NoBlocking模式下(异步)
指令
1、登录成功反馈指令,此时,需要初始化一些全局列表
2、接受消息指令,此时需要根据全局列表做相应的处理
此时,ClientSocket需要接受这两个指令做相应的处理,可是此时出现,指令1没有处理完,就处理指令2,从而由于全局列表没有初始化成功而导致程序出错。
我现在用信号源做处理,Onread的时候先waitforsingleObject,处理结束后再setEvent(hmutex)。
但是,处理指令2的时候,waitforsingleObject是在等待信号源,但是指令1缺不会处理了,程序死了。
请问我应该如何处理这种情况呢,如何让指令2等待指令1结束后处理呢?
处于NoBlocking模式的clinetSocket应该为每次OnRead开启一个线程吗?

解决方案 »

  1.   

    TO  ad_zhang_main(我是旁观者)
    我现在指令1不会执行了,不知道为什么?简单一点,就是这样
    第一次onRead消息触发,执行初始化列表
    第二次onRead消息触发,需要读取列表中的信息.
    但是,执行初始化列表没有结束,第二次OnRead消息就触发了,从而需要读取列表时程序出错.  
      

  2.   

    procedure TF_Main.cs_1Read(Sender: TObject; Socket: TCustomWinSocket);
    begin
      waitForsingleObject(hMutex,INFINITE);
      case iZl of
        1:
            begin
            //初始化列表中
            end;
        2:
          begin
          //Recv message
          //根据列表处理
          end;
        end;
      setEvent(hMutex);
    end;
      

  3.   

    用一個List來保存接收到的命令, 處理部分獨立出來, 從List取第一條記錄, 處理完一個, 再取第二個命令, 接下處理
      

  4.   

    来不及仔细看,
    OnRead事件是触发在主线程,不要这个事件里面作阻塞线程的同步操作。。就算要等待。。也只能类似while(xxx) Appliaction.processMessages;方式等待。
    当然,在ONREAD事件里面这样消息循环等待也有很多细节要处理。
      

  5.   

    你问题本质是希望将接收的数据序列化,从来保证状态转换的可靠性。也可以这样,OnRead里面解析数据,然后将请求追求进一个自定义的队列里面。
    指令在队列里面,这样比用程序流程来形成队列要清晰些。
      

  6.   

    你问题本质是希望将接收的数据序列化,从来保证状态转换的可靠性。也可以这样,OnRead里面解析数据,然后将请求追求进一个自定义的队列里面。
    指令在队列里面,这样比用程序流程来形成队列要清晰些。
      

  7.   

    To:halfdream(哈欠) ,aiirii(ari) 
      处理的不仅是指令,还有数据.那么需要把指令和数据同时进入list,那么,如果由于指令1及数据入list时间过长,也可能在处理过程中也可能出现我上述的问题.
      OnRead事件是触发在主线程,不要这个事件里面作阻塞线程的同步操作  ,这是正确的.导致阻塞主线程,而死掉.
    有没有其他解决方法呢?