Frage

Ich möchte meine Anwendung von Indy 9 bis 10 mit Delphi 2007 aktualisieren. In diesem Thread gibt es einen Aufruf an Indy9 TIdUDPBase.SendBuffer aber dies wird in Indy10 als Methode nicht kompiliert Parameter nicht vorhanden ist. Der dritte Parameter aBuffer ist ein var-Parameter, und ich habe keine solche Methodensignatur in Indy10 finden. Jede alternative Methode zum Aufruf?

procedure TSenderThread.Execute;
var
  vTimeData: TTimeDataRecord;
  I: Integer;
  FElapsed: Int64;
  FTimerElappsed,
  vLastTimerElappsed: Int64;
begin
  vTimeData.Size := SizeOf(TTimeDataRecord);
  vTimeData.ClientCount := 1;
  Priority := tpHighest;
  FIdUDPClient := TIdUDPClient.Create(nil);
  FIdUDPClient.BroadcastEnabled := True;
  try
    while not (Terminated or Application.Terminated) do
    begin
      Sleep(1000);
      //Measure Time frame
      vLastTimerElappsed := FTimerElappsed;
      QueryPerformanceCounter(FTimerElappsed);
      FElapsed := ((FTimerElappsed-vLastTimerElappsed)*1000000) div FFrequency;
      vTimeData.TotalTimeFrame := FElapsed;
      if FRunning then
      begin
        FElapsed := ((FTimerElappsed-FStart)*1000000) div FFrequency;
        vTimeData.CurrentMessageTime := FElapsed;
      end
      else
        vTimeData.CurrentMessageTime := 0;
      //Copy Values
      vTimeData.AccumulatedTime := InterlockedExchange(TimeData.AccumulatedTime,0);
      vTimeData.MessageCount := InterlockedExchange(TimeData.MessageCount,0);
      for I := 0 to TimeClassMax do
        vTimeData.TimeClasses[I] := InterlockedExchange(TimeData.TimeClasses[I],0);

       // Calls procedure TIdUDPBase.SendBuffer(AHost: string; const APort: Integer; var ABuffer; const AByteCount: integer);
       // This is changed in Indy10, unable to compile  
      FIdUDPClient.SendBuffer('255.255.255.255', UIPerfPort, vTimeData, TimeData.Size);
    end;
  finally
    FreeAndNil(FIdUDPClient);
  end;
end;

EDIT: vTimeData ist im Grunde eine Reihe von ganzen Zahlen.

  TTimeDataRecord = record
    Size: Integer; //Size of record structure is transfered and compared for safty reasons.
    ClientCount: Integer;
    AccumulatedTime: Integer; //This is the accumulated time busy in microseconds
    CurrentMessageTime: Integer; //This is the time the current message has been processed. If several computers report a high value at the same time it indicates a freeze!
    TotalTimeFrame: Integer; //This is the total time measured in microseconds
    MessageCount: Integer;
    TimeClasses: array [0..TimeClassMax] of Integer;
  end;
War es hilfreich?

Lösung

Sie haben eine Methode mit demselben Namen

procedure TIdUDPClient.SendBuffer(const AHost: string; const APort: TIdPort;
  const ABuffer: TIdBytes);

Statt einer nicht typisierten Puffer erwartet er ein Array von Bytes. Was ist Ihre Daten wie? Sie müssen nur Ihre Daten als ein Array von Bytes schreiben. So etwas wie:

var
 Buffer: TIdBytes;
begin
 SetLength(Buffer, YourSizeOfData);
 Move(YourData, Buffer[0], YourSizeOfData);
 FIdUDPClient.SendBuffer('255.255.255.255', UIPerfPort, Buffer);
end;

Aber wie gesagt es von der Art der Daten abhängt. Der Ansatz ist in Ordnung, aber.

EDIT:

Nun, da ich sehe, dass Sie einen Datensatz haben Sie haben zwei Möglichkeiten:

Bewegen Sie den gesamten Datensatz auf Byte-Array.

Move(@aRecord, Buffer[0], (6 + TimeClassMax) * SizeOf(Integer));

Haben Sie eine CopyToBytes Methode in Ihrem Datensatz, der die aktuelle Kopie der Fall ist. Allgemeinere I guess.

TTimeDataRecord = record
  Size: Integer; //Size of record structure is transfered and compared for safty reasons.
  ClientCount: Integer;
  AccumulatedTime: Integer; //This is the accumulated time busy in microseconds
  CurrentMessageTime: Integer; //This is the time the current message has been  processed. If several computers report a high value at the same time it indicates a freeze!
  TotalTimeFrame: Integer; //This is the total time measured in microseconds
  MessageCount: Integer;
  TimeClasses: array [0..TimeClassMax] of Integer;
  procedure CopyToBytes(var Buffer: TIdBytes);
end

Die Umsetzung des CopyToBytes

procedure TTimeDataRecord.CopyToBytes(var Buffer: TIdBytes);
begin
  // copy the data however you see fit
end;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top