Delphi 将Indy9升级到Indy10
我想用Delphi2007将我的应用程序从Indy9升级到10。 在该线程中,有一个对Indy9 TIdUDPBase.SendBuffer的调用,但由于方法参数不存在,因此不会在Indy10中编译。第三个参数aBuffer是一个var参数,我在Indy10中没有找到任何这样的方法签名。 有其他方法可以调用吗Delphi 将Indy9升级到Indy10,delphi,indy,Delphi,Indy,我想用Delphi2007将我的应用程序从Indy9升级到10。 在该线程中,有一个对Indy9 TIdUDPBase.SendBuffer的调用,但由于方法参数不存在,因此不会在Indy10中编译。第三个参数aBuffer是一个var参数,我在Indy10中没有找到任何这样的方法签名。 有其他方法可以调用吗 procedure TSenderThread.Execute; var vTimeData: TTimeDataRecord; I: Integer; FElapsed: I
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;
编辑:
vTimeData基本上是一个整数数组
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;
您有一个同名的方法
procedure TIdUDPClient.SendBuffer(const AHost: string; const APort: TIdPort;
const ABuffer: TIdBytes);
它需要一个字节数组,而不是一个非类型化的缓冲区。你的数据是什么样的?您只需要将数据写入字节数组。比如:
var
Buffer: TIdBytes;
begin
SetLength(Buffer, YourSizeOfData);
Move(YourData, Buffer[0], YourSizeOfData);
FIdUDPClient.SendBuffer('255.255.255.255', UIPerfPort, Buffer);
end;
但正如我所说,这取决于数据的类型。然而,这种方法是可行的
编辑:
现在我可以看到您有一个记录,您有两个选择:
只需将整个记录移动到字节数组
Move(@aRecord, Buffer[0], (6 + TimeClassMax) * SizeOf(Integer));
在您的记录中有一个CopyToBytes方法来进行实际复制。我想更一般
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
CopyToBytes的实现
procedure TTimeDataRecord.CopyToBytes(var Buffer: TIdBytes);
begin
// copy the data however you see fit
end;
它是一条记录,请参见更新,但它只包含整数。也许我可以将其类型转换为TIdBytes,或者我必须将其复制到另一个TIdBytes类型的缓冲区?仅供参考,Indy 10具有RawToBytes()和BytesToRaw()函数,用于将TIdBytes值从/转换为原始内存块。