用Delphi做了一个directshow的网络源Filter,用的是TIdUDPServer接受UDP数据,但IdUDPServerUDPRead不触发呢,在关闭程序的时候却触发了,奇怪的问题,有碰到类似问题的朋友没?

解决方案 »

  1.   

    directshow的Filter就是一个Com组件.
    创建部分的
    constructor TBCPushPinNetwork.Create(out hr: HResult; Filter: TBCSource);
    begin
      inherited Create('_ Push Source Network', hr, Filter, 'Out');  UdpSocket := TIdUDPServer.Create(nil);
      UdpSocket.DefaultPort := RtpNetworkPort;
      UdpSocket.OnUDPRead := IdUDPServerUDPRead;
    end;
    设置端口部分的
      UdpSocket.Active := False;
      UdpSocket.DefaultPort := StrToIntDef(LocalPort,2286);
      UdpSocket.Active := True;
    开始怀疑是不是Create时没有传一个窗口句柄给它,所以收不到消息,刚才把Form的句柄传给它,但还是一样.
      if UdpSocket = nil then
      begin
        UdpSocket := TIdUDPServer.Create(axOwner);
        UdpSocket.DefaultPort := RtpNetworkPort;
        UdpSocket.OnUDPRead := IdUDPServerUDPRead;
     end; 
      

  2.   

    遇到过相同情况;结果为端口绑定问题;当IdUDPServer.Active:=False再TRUE;端口绑定为随机;IdUDPServer.Bindings组在关闭的时候会销毁;IdUDPServer.Bindings.add过程才载入默认端口DefaultPort; 
    尝试设置端口绑定:
        IdUDPServer.Active:=False;
        IdUDPServer.Bindings.Clear;
        IdUDPServer.DefaultPort:=Port;
        IdUDPServer.Bindings.Add;
        IdUDPServer.Active:=True;
      

  3.   

    谢谢,但我还没重复打开,关闭呢,而且端口里有数据,只是不触发OnUDPRead事件,用线程调用ReceiveBuffer能读到数据.
      

  4.   

    TIdUDPServer不需要窗口的,他用的SOCKET的SELECT模型
    他的原理其实很简单,Active = True 时建了一个接受线线然后不停地读数据 在 TIdThread类中调用派生类的run函数COM里的,这个INDY控件我也用过, 好象是有问题,INDYSERVE好象是发不出去包,
    后来用INDYCLIENT代替的