PUDPRecvData = ^TUDPRecvData;
  TUDPRecvData = record
    Data: array[0..MAX_RECVBUF] of Byte;
    DataCnt: Integer;
    IP: array[0..15] of Char;
    Port: Integer;
  end;
procedure TfrmMain.UDPServerPBXUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  iCnt, i: Integer;
//  sStr: string;
  lUDPRecvData: PUDPRecvData;
begin
  lUDPRecvData := New(PUDPRecvData);
  iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
  lUDPRecvData^.DataCnt := iCnt;
  CopyMemory(@lUDPRecvData^.IP[0], @ABinding.PeerIP[1], 16);
  lUDPRecvData^.Port := ABinding.PeerPort;
  gRecvDataList.Push(lUDPRecvData);  //gRecvDataList是个队列//  if UDPDataDealwithThread.Suspended then
    UDPDataDealwithThread.Resume;
end;数据收下来后,存在队列里,然后开线程去队列取出数据,做相应的处理
procedure TUDPDataDealwithThread.Execute;
var
  lUDPRecvData: PUDPRecvData;
begin
  repeat
    if gRecvDataList.Count > 0 then
    begin
      lUDPRecvData := gRecvDataList.Pop;      fPointer := 0;
      while (fPointer < lUDPRecvData^.DataCnt) do
      begin
        if Analyse(lUDPRecvData^.Data, lUDPRecvData^.DataCnt) then
        begin
          //显示调试信息
          DealWith(lUDPRecvData^.IP, lUDPRecvData^.Port);
        end;
      end;//      try
      Dispose(lUDPRecvData);  //接收数据后,有时候会报指针错误/
//      except
//        ShowMessage('7');
//      end;
    end
    else UDPDataDealwithThread.Suspend;
  until Terminated;
end;     Dispose(lUDPRecvData);  //接收数据后,有时候会报指针错误/
百思不得其解?大家帮忙找找问题没有其他的线程操作,队列就这两个地方用。

解决方案 »

  1.   

    lUDPRecvData := gRecvDataList.Pop;pop是 返回分配内存指针的函数 还是 成员变量?
    一个线程分配,另一个线程释放?
      

  2.   

    sz_haitao:pop是 返回分配内存指针的函数, TQueue.pop主线程中接收数据,另一线程处理后释放
      

  3.   

    为什么出错误,暂时没看出来,但是你在两个线程中使用队列的方式是错误的。
    因为你不能保证你在处理数据的线程正在pop的时候,接收线程不能push,也就是说,在同一个时刻,对这个队列可能既pop又push
    你可以考虑使用TThreadList,至少他能保证多线程之间是安全的。还有这句
    iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
    你是否能保证 AData.Size一定小于MAX_RECVBUF,
    如果比MAX_RECVBUF大,大多少?是否超出了SizeOf(TUDPRecvData)以上两点都有可能导致pop出来的指针是错误的
      

  4.   

    wxieyang:iCnt := AData.Read(lUDPRecvData^.Data[0], AData.Size);
    这里我有判断大小,我没贴出来
    现在知道,应该是两个线程如何同步的问题,谢谢。