2010-01-11 2 views
0

Je veux mettre à jour mon application d'Indy 9 à 10 avec Delphi 2007. Dans ce fil, il y a un appel à Indy9 TIdUDPBase.SendBuffer mais cela ne compilera pas dans Indy10 comme le paramètre de méthode ne pas existe. Le troisième paramètre aBuffer est un paramètre var et je n'ai trouvé aucune signature de méthode dans Indy10. Toute méthode alternative à appeler?Mise à niveau Indy9 à Indy10

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 est essentiellement un tableau d'entiers.

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; 

Répondre

0

vous avez une méthode avec le même nom

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

Au lieu d'un tampon typées il attend un tableau d'octets. A quoi ressemblent vos données? Vous avez juste besoin d'écrire vos données sous la forme d'un tableau d'octets. Quelque chose comme:

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

Mais comme je l'ai dit, cela dépend du type de données. L'approche est ok cependant.

EDIT:

Maintenant que je peux voir que vous avez un disque que vous avez deux options:

il suffit de déplacer l'ensemble du dossier à un tableau d'octets.

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

ont une méthode CopyToBytes dans votre dossier qui fait la copie réelle. Plus général je suppose.

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 

Mise en œuvre des CopyToBytes

procedure TTimeDataRecord.CopyToBytes(var Buffer: TIdBytes); 
begin 
    // copy the data however you see fit 
end; 
+0

Il est un enregistrement, voir la mise à jour mais il contient des nombres entiers. Peut-être que je peux le classer dans TIdBytes ou dois-je le copier dans un autre tampon de type TIdBytes? –

+0

Oui, vous devez le copier. Voir ma réponse mise à jour. – Runner

+0

Merci, c'est logique. –