Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сохранение данных из WM_COPYDATA


Автор: <Spawn> 3.9.2003, 08:54
При перехвате пакета перекидываю его в свою прогу при помощи WM_COPYDATA. Но как не пытался не получалось сделать сохранение всех данных CopyMemory или Move. Пришлось в цикле сохранять, но скорость тут очень критична, поскольку нельзя на долго приостанавливать пакет, так как тормоза тогда будут... А WM_COPYDATA можно использовать только с SendMessage.
Сейчас так:
Код
procedure ViewAndSavePacket(var buf;Len:integer);
var
pb:PByte;
i:integer;
begin
Inc(CurrentPacketN);
ShowCurrSize(Len);
fAllodsMonitor.lbpNumber.Items.Add(IntToStr(CurrentPacketN));
//////////////
SetLength(Packets,CurrentPacketN);
SetLength(Packets[CurrentPacketN-1].Buf,Len);
pb:=PByte(buf);
for i:=0 to len-1 do
begin
 Packets[CurrentPacketN-1].Buf[i]:=pb^;
 Inc(pb);
end;
Dec(pb,len);
//////////////
if fAllodsMonitor.glcbxShowPackets.Checked then
begin
 ViewPacket(buf,Len,CurrentPacketN,
            fAllodsMonitor.lbpElements,
            fAllodsMonitor.gllblPacketOne,dtByte);
end;
end;


А хотелось бы что бы было например так:
Код
SetLength(Packets,CurrentPacketN);
SetLength(Packets[CurrentPacketN-1].Buf,Len);
CopyMemory(@Packets[CurrentPacketN-1].Buf,@Buf,Len);

Автор: p0s0l 3.9.2003, 16:19
надо так:
CopyMemory(@Packets[CurrentPacketN-1].Buf[0],@Buf,Len);

Автор: <Spawn> 4.9.2003, 07:39
p0s0l Access Violetion

Автор: <Spawn> 4.9.2003, 07:55
Как ни странно, но на этот цикл уходит не больше 10 млс(а за частую вообще 0 показывает!!!). Как такое может быть, ведь в нем 8192 итерации?(Проверял при помощи GetTickCount):

StartTime:=GetTickCount;
pb:=PByte(buf);
for i:=0 to len-1 do
begin
Packets[CurrentPacketN-1].Buf[i]:=pb^;
Inc(pb);
end;
Dec(pb,len);
EndTime:=GetTickCount;
AddMessage(Format('time - %d',[EndTime-StartTime]));

Автор: p0s0l 4.9.2003, 19:44
Я плохо посмотрел, надо было так:
CopyMemory(@Packets[CurrentPacketN-1].Buf[0],pointer(Buf),Len);
Цитата
но на этот цикл уходит не больше 10 млс

Еще бы! Это же тебе не спектрум...
Цитата
а за частую вообще 0 показывает

Просто дискретность GetTickCount равняет 10 мс, т.е. если прошло 9 мс, то GetTickCount выдаст 0.


Автор: <Spawn> 6.9.2003, 08:46
Хм. Так действительно все работает. Спасибо )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)