AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Merkwürdiges Verhalten von Named Pipes unter Win7

Merkwürdiges Verhalten von Named Pipes unter Win7

Ein Thema von Dalai · begonnen am 29. Okt 2014 · letzter Beitrag vom 13. Nov 2014
Antwort Antwort
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#1

Merkwürdiges Verhalten von Named Pipes unter Win7

  Alt 29. Okt 2014, 16:59
Hallo in die Runde ,

ich muss die Gemeinde mal wieder mit einem Problem belästigen, das ich selbst weder verstehe noch ohne Hilfe weiter untersuchen kann.

Kurz zur Vorgeschichte: Ich stieß kürzlich auf ein sehr merkwürdiges Verhalten einer meiner Applikationen unter Win7 mit IE10 und IE11 (mit IE8 oder IE9 trat das nicht auf), das irgendwie so aussah, als ob die benutzte Named Pipe blockiert ist. Also hab ich das genauer untersucht und eine Testapplikation geschrieben und das Problem dort in ähnlicher Art nachstellen können.

Was ist das Problem?
Jedes Senden eines Strings durch den Client erhöht die Anzahl der Instanzen auf der Pipe, wie man mit Sysinternals PipeList nachvollziehen kann, obwohl der Client direkt nach dem Senden des Strings und Flushen der Buffer die Verbindung mit Disconnect wieder trennt. Soweit sieht das erstmal nach keinem Problem aus, nur ist es so, dass sich der Pipe-Server in einer solchen Situation nicht mehr schließen lässt, weil dieser unendlich wartet, bis die Clients weg sind, obwohl das schon längst der Fall ist (Client-Prozess wurde beendet).

Lustigerweise tritt es mit der Testapplikation auch mit IE8 auf. Und es wird noch kurioser: es kommt nur zum Problem, wenn der Pipe-Server ein Manifest benutzt, das einerseits Laufzeit-Themes aktiviert und andererseits Kompatibilität mit Win7 beinhaltet; sobald eine der beiden Bedingungen nicht mehr zutrifft, ist das Problem verschwunden. Unter XP lässt sich das Problem gar nicht nachvollziehen; andere Windows-Versionen hab ich mit den Testprogrammen nicht getestet.

Aber kommen wir zum Wesentlichen: Ich benutze die Pipes-Komponente von Russell Libby, die man z.B. von dieser Seite bekommt. Als Beispielprogramme sollen diese beiden dienen:

Server:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Pipes, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    PipeServer1: TPipeServer;
    Button1: TButton;
    Edit1: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure PipeServer1PipeMessage(Sender: TObject; Pipe: Cardinal;
      Stream: TStream);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
{$R XP.res}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    PipeServer1.Active:= False;
end;

procedure TForm1.PipeServer1PipeMessage(Sender: TObject; Pipe: Cardinal;
  Stream: TStream);
var text: string;
    dummy: integer;
    buffer: array of char;
begin
    SetLength(buffer, Stream.Size);
    dummy:= Stream.Read(buffer[0], Stream.Size);
    text:= String(PChar(buffer));
    SetLength(buffer, 0);
    Memo1.Lines.Add(text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Memo1.Lines.Add(IntToStr(PipeServer1.ClientCount) + ' clients connected');
    PipeServer1.Active:= False;
    PipeServer1.PipeName:= Edit1.Text;
    PipeServer1.Active:= True;
end;

end.
Client:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Pipes, StdCtrls;

type
  TForm1 = class(TForm)
    PipeClient1: TPipeClient;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var myString: string;
    iLength: integer;
begin
    if PipeClient1.Connect(5000) then
    begin
        myString:= Edit1.Text;
        iLength:=Length(myString);
        // Send pipe message
        if PipeClient1.Write(mystring[1], iLength) then
        begin
            // Flush the pipe buffers
            PipeClient1.FlushPipeBuffers;
        end;
        PipeClient1.Disconnect;
    end;
end;

end.
Kann das Problem jemand nachvollziehen? Hatte das jemand bereits? Wie kann ich weiter vorgehen?

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#2

AW: Merkwürdiges Verhalten von Named Pipes unter Win7

  Alt 1. Nov 2014, 13:43
Hat jemand eine Idee? Ich stell die Frage mal anders: Wer hat bereits erfolgreich Named Pipes benutzt und wie? Gibt's andere Möglichkeiten, Text von einer Anwendung zur anderen zu schicken?

MfG Dalai
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Merkwürdiges Verhalten von Named Pipes unter Win7

  Alt 1. Nov 2014, 13:51
Hat jemand eine Idee? Ich stell die Frage mal anders: Wer hat bereits erfolgreich Named Pipes benutzt und wie? Gibt's andere Möglichkeiten, Text von einer Anwendung zur anderen zu schicken?
Selber damit gearbeitet habe ich nicht, aber ich habe zu Named Pipes gelesen dass sie auf Memory Mapped Files basieren.

Mit Memory Mapped Files sollen auch Java Anwendungen extrem hohe Übertragungsraten zu anderen (auch nicht-Java) Anwendungen erreichen.

Andere Möglichkeiten bieten sich mit TCP/IP, entweder mit einem eigenen Protokoll oder einem Standard wie MQTT oder STOMP. Die Auswahl hängt stark von den Rahmenbedingungen ab (soll es sprachunabhängig, betriebssystemunabhängig, zwischen verschiedenen Rechnern einsetzbar sein ...)
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#4

AW: Merkwürdiges Verhalten von Named Pipes unter Win7

  Alt 1. Nov 2014, 15:50
Andere Möglichkeiten bieten sich mit TCP/IP, entweder mit einem eigenen Protokoll oder einem Standard wie MQTT oder STOMP.
TCP/IP ist zu aufwendig, jedenfalls nehme ich das an.

Zitat:
Die Auswahl hängt stark von den Rahmenbedingungen ab (soll es sprachunabhängig, betriebssystemunabhängig, zwischen verschiedenen Rechnern einsetzbar sein ...)
OK, ich erkläre mal, wofür ich das brauche: Es gibt ein Delphi-Programm, das einen "Server" darstellt und ausschließlich zum Empfang der Daten (=simple Strings) dient, um sie in einem Fenster anzuzeigen/darzustellen und außerdem in eine Logdatei wegzuschreiben. Es gibt weiterhin einen "Client" in Form eines AutoIt-Skripts (gestartet vom Server aus), der diese Daten sendet. Früher hab ich das anders gemacht (Client schrieb direkt in die Logdatei und der Server las daraus), aber davon wollte ich weg, weil es u.U. unzuverlässig war und schlechtes Design noch dazu. Alles spielt sich innerhalb desselben Rechners und innerhalb desselben Nutzerkontos ab.

Das bedeutet, es wird eine Variante benötigt, die auf einfache Weise in AutoIt zu implementieren ist. Gerade außerhalb der vordefinierten Funktionen wird's da schnell dünn... Funktionen für Named Pipes gibt es, und daher nutze ich diese seit Jahren, bis ich vor einiger Zeit auf das im OP genannte Problem stieß.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.679 Beiträge
 
Delphi 5 Professional
 
#5

Update

  Alt 13. Nov 2014, 17:27
Faszinierend. Spaßeshalber hab ich die Testanwendung mit XE2 kompiliert und was soll ich sagen: es funktioniert . Keine Ahnung, ob das an Unicode liegt oder an einem evtl. ungünstig implementierten Verhalten von irgendwas in älteren Delphi-Versionen. Da es mit der Testanwendung funktionierte, hab ich gestern die eigentliche Anwendung ebenfalls mit XE2 verarbeitet und auch diese funktioniert.

Verstehen tue ich das nicht, aber schön, dass ich bei Named Pipes bleiben kann und mir so den Umbau des AutoIt-Client und auch des Servers spare .

Dennoch wäre ich dankbar, wenn sich noch jemand meldet, der Named Pipes benutzt und mir sagen kann, wie bzw. womit er/sie die benutzt oder ob das Phänomen nachvollziehbar ist.

MfG Dalai
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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