Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IcmpSendEcho unterbricht mein Programm? (https://www.delphipraxis.net/188809-icmpsendecho-unterbricht-mein-programm.html)

alfold 8. Apr 2016 12:42

IcmpSendEcho unterbricht mein Programm?
 
Ich teste gerade IcmpSendEcho. Dabei stelle ich fest das beim ausführen es zu kurze Unterbrechungen im Programmablauf kommt!
Dabei ist es egal ob das im Timer, oder als Thread ausgeführt wird.
Besonders bemerkbar bei Musik Wiedergabe!(Ich verwende die Bass.dll von Un4seen)
Der Ping wird nur im Lan benutzt, nicht fürs Inet!!!!
Die Audiodateien befinden sich auch im Lan.
Die Abfrage erfolgt jede Sekunde. Die wartezeit beträgt 500ms.
Ist aber unabhängig davon, habe ich festgestellt!

Gehe ich da eventuell richtig in der Anahme, das bei der Anfrage an den "Server" und bei der Rückmeldung, IcmpSendEcho das Programm für den kurzen Moment unterbricht!? :gruebel:

Anmerkung: Beim Transfer von grossen Daten vom PC zum "Server" oder zurück, unabhängig von IcmpSendEcho, gibt es keine aussetzer. Also sehr Merkwürdiges verhalten von IcmpSendEcho!

Gruß alfold

Valle 8. Apr 2016 12:57

AW: IcmpSendEcho unterbricht mein Programm?
 
Zitat:

Zitat von alfold (Beitrag 1335042)
Dabei ist es egal ob das im Timer, oder als Thread ausgeführt wird.

Ich vermute, hier liegt der Knackpunkt.

IcmpSendEcho kehrt erst zurück, wenn eine Antwort oder eine Timeout eingetreten ist. Folglich wird also natürlich der jeweilige Thread des laufenden Programms unterbrochen, bis dieser Fall eingetreten ist. Ein Timer gehört zum Hauptthread und unterbricht somit auch die GUI.

Solltest du allerdings einen eigenen Thread für den Ping verwenden, so wird nur dieser unterbrochen und alle anderen Threads des Programms laufen wie gehabt weiter. Ist das bei dir nicht der Fall, gehe ich stark davon aus, dass du einen Fehler in der Threadimplementierung hast.

alfold 8. Apr 2016 13:16

AW: IcmpSendEcho unterbricht mein Programm?
 
Ich hoffe es wird nicht peinlich. :roll:
im Main
Delphi-Quellcode:
if UncPath <> '' then
begin
        tmpPath:= ExtractFileName(ExtractFiledir(ExtractFiledir(ExcludeTrailingPathDelimiter(UncPath))));
        if tmpPath <> '' then
        begin
           PingThread:= TPingThread.Create(tmpPath);
           PingHndl:= PingThread.Handle;
           PingThread.FreeOnTerminate := False;
           PingThread.Resume;
        end;

end;
und hier der Thread
Delphi-Quellcode:
unit PingThread;

interface
uses
  Windows, Classes, SysUtils, PingTest;

type
  TPingThread = class(TThread)
  private

    afHostName: string;
    aPing: Boolean;

    procedure UpdateStaus;
    procedure Finished;
    procedure Abort;

  protected
      procedure Execute; override;
      procedure GetPing();
  public
    constructor Create(FHostname: string);

  end;

implementation

uses
   MxMain;

constructor TPingThread.Create(fHostname: string);
begin
        inherited create(False);
        priority:= tpTimeCritical;
        FreeonTerminate:= False;
        afHostName:= FHostname;
       
end;

procedure TPingThread.Abort;
begin
    MxPlayer.Abort;
end;

procedure TPingThread.Execute;
begin
   while not Terminated do
   begin
        GetPing();
        Sleep(1000);
   end;
end;

procedure TPingThread.Finished;
begin
    MxPlayer.Finished;
end;

procedure TPingThread.UpdateStaus;
begin
    if self.Terminated then
    begin
        Synchronize(Abort);
        Exit;
    end;
    MxPlayer.UpdateStatus(aPing);
end;

procedure TPingThread.GetPing();
begin
    if Self.Terminated then
    begin
        Synchronize(Abort);
        Exit;
    end;
    aPing:= Ping(afHostName);
    Synchronize(UpdateStaus);
end;

end.
Schaun wir mal wo ich mist gebaut habe!

Gruß alfold

Valle 8. Apr 2016 18:31

AW: IcmpSendEcho unterbricht mein Programm?
 
Mh, du startest mit create(false) (also nicht suspended) und rufst trotzdem Resume auf.

Weiß aber nicht ob es daran liegt.

(Ansonsten ist es bestimmt das fehlende T bei UpdateStatus :stupid: )

mjustin 9. Apr 2016 07:27

AW: IcmpSendEcho unterbricht mein Programm?
 
Die Notwendigkeit von priority:= tpTimeCritical; erschliesst sich mir nicht, daher würde ich es eliminieren.

Nur eine Stilfrage, aber den MxPlayer würde ich nicht aus dem Thread, ansprechen sondern nur eine Callback-Funktion verwenden, die der Thread mit dem Ping-Ergebnis aufrufen darf.

Sir Rufo 9. Apr 2016 09:00

AW: IcmpSendEcho unterbricht mein Programm?
 
Dieses
Delphi-Quellcode:
tpTimeCritical
ist hier eher schädlich, da jetzt dieser Thread bevorzugt vor allen anderen behandelt wird und somit Auswirkungen auf den Rest haben kann.

Dabei muss der doch nur warten ... zeitkritisch ist das auf keinen Fall.

alfold 10. Apr 2016 09:21

AW: IcmpSendEcho unterbricht mein Programm?
 
THX an alle

Ursache für die Aussetzer ist die IDE. Warum auch immer!
Da Sitzt man Tagelang dran um die Ursache zu beseitigen, ruft hier um Hilfe und stellt dann fest,
Ohne IDE gibt es keine Aussetzer.

Zitat:

Zitat von Sir Rufo (Beitrag 1335138)
Dieses
Delphi-Quellcode:
tpTimeCritical
ist hier eher schädlich... .

Kommt halt von c+p. Ist noch von meinem FTP Thread:wink:
Zitat:

Zitat von mjustin (Beitrag 1335133)
...Nur eine Stilfrage.... .

hab ich geändert :P
Zitat:

Zitat von Valle (Beitrag 1335099)
...
(Ansonsten ist es bestimmt das fehlende T bei UpdateStatus :stupid: )

Auch im Thread können Staus entstehen :mrgreen:



Also noch mal Danke an alle
Gruß alfold


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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