Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread: Kann ich sicher sein, das die Daten stimmen? (https://www.delphipraxis.net/43983-thread-kann-ich-sicher-sein-das-die-daten-stimmen.html)

Die Muhkuh 11. Apr 2005 16:54


Thread: Kann ich sicher sein, das die Daten stimmen?
 
Hi,

erstmal Code:

Delphi-Quellcode:
procedure Tfmain.UsersGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Data: PUserData;
  Pinger: TPinger;
begin
  Data := Users.GetNodeData(Node);

  case Column of
    0: CellText := Data^.FName;
    1: CellText := '';
    2: CellText := '';
    3:
      begin  
        Pinger := TPinger.Create(true);
        Pinger.Priority := tpTimeCritical;
        Pinger.IP := Data^.FIP;
        Pinger.Resume;

        CellText := IntToStr(Time);
      end;
  end;
end;

{Unit uping}
procedure TPinger.Execute;
var
  Start, Ende: Int64;
begin
  inherited;
  Start := GetTickCount;
  Ping(IP);
  Ende := GetTickCount - Start;
  aReply := Ende;
  Synchronize(UpdateTime);
  Terminate;
end;

function TPinger.Ping(InetAddress: string): boolean;
var
  Handle: THandle;
  InAddr: IPAddr;
  DW: DWORD;
  rep: array[1..128] of byte;
begin
  result := false;
  Handle := IcmpCreateFile;
  if Handle = INVALID_HANDLE_VALUE then
    Exit;
  TranslateStringToTInAddr(InetAddress, InAddr);
  DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, 0);
  Result := (DW <> 0);
  IcmpCloseHandle(Handle);
end;

procedure TPinger.UpdateTime;
begin
  Time := aReply;
end;
Wie man sieht, führe ich einen Ping aus. Ich bekomme auch die Zeit zurück. Nur, kann ich sicher sein, das der Ping stimmt? Das Programm läuft ja weiter während der Thread pingt. Kann es zu verfälschten Daten kommen. Oder läuft das Hauptprogramm nicht weiter, weil der Thread mit höchster Priorität läuft?

Die Muhkuh 11. Apr 2005 17:05

Re: Thread: Kann ich sicher sein, das die Daten stimmen?
 
Hi,

ok, es sind falsche Daten.

Kann ich nicht irgendwie auf den Thread warten?
Delphi-Quellcode:
procedure Tfmain.UsersGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Data: PUserData;
  Pinger: TPinger;
begin
  Data := Users.GetNodeData(Node);

  case Column of
    0: CellText := Data^.FName;
    1: CellText := '';
    2: CellText := '';
    3:
      begin  
        Pinger := TPinger.Create(true);
        Pinger.Priority := tpTimeCritical;
        Pinger.IP := Data^.FIP;
        Pinger.Resume;
        // Hier auf den Thread warten, bis er durch ist.
        CellText := IntToStr(Time);
      end;
  end;
end;

md_mse 11. Apr 2005 17:43

Re: Thread: Kann ich sicher sein, das die Daten stimmen?
 
Wenn du an dieser Stelle auf den Thread warten willst, warum machst du das denn in ein Thread? :?:
Kannst ja den Thread mit Execute "ausführen", was aber nicht der Sinn von Threads ist...

P.S.: Noch eine Möglichkeit ist einfach mal "Pinger.WaitFor" vom MainThread aus aus zu führen...

Die Muhkuh 11. Apr 2005 18:27

Re: Thread: Kann ich sicher sein, das die Daten stimmen?
 
Hi,

ich glaube das WaitFor ist genau das, was ich gesucht habe. Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz