AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Schnelle Datenübertragung zwischen zwei Programmen
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelle Datenübertragung zwischen zwei Programmen

Ein Thema von SneakyBagels · begonnen am 29. Jun 2017 · letzter Beitrag vom 30. Jun 2017
Antwort Antwort
SneakyBagels
(Gast)

n/a Beiträge
 
#1

Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 22:01
Ich suche aktuell eine möglichst schnelle Möglichkeit Records von einer Exe zu einer anderen zu schicken.
Aktuell teste ich ein bisschen rum und schicke einen String über das TCopyDataStruct und Sendmessage/FindWindow zu der anderen Exe.
Der String enthält kommaseparierte Daten welche dann vom Empfänger auseinandergenommen werden.

Geht das irgendwie anders? StaticText Labels möchte ich keine Nutzen. Direkt in die Controls schreiben ist auch nicht möglich.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 22:08
Gibt etliche Möglichkeiten. Zwei prominente Varianten wären Pipes oder MemoryMappedFiles (MMF).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#3

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 22:36
Gibt etliche Möglichkeiten. Zwei prominente Varianten wären Pipes oder MemoryMappedFiles (MMF).
Für ersteres gibt es hier eine gute Erklärung und sogar noch die Sourcen für die Komponenten: Inter Process Communication Using Pipes
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#4

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 23:13
Hintergrund:
ich habe ein Formular in meiner Anwendung das von Zeit zu Zeit über längere Zeit angezeigt und mit Daten versorgt wird.
Die Daten werden in einem Thread A Variablen zugewiesen und im Thread B abgefragt.

Ich möchte das Formular samt Thread B nun gerne in eine eigene Exe auslagern.
Thread A würde die Daten dann an die zweite Exe schicken.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 23:31
Und warum möchtest du das?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#6

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 23:34
Ich quäle mich schon ewig damit rum eine ProgressBar-Anzeige in einem Taskbutton anzuzeigen.
Das funktioniert ja alles wunderbar aber leider wird die Anzeige immer nur im ersten Button dargestellt.
Wenn ich ein Formular mit CreateParams erzeuge (ExStyle => Params.ExStyle or WS_EX_APPWINDOW) habe ich zwei Buttons der Anwendung gruppiert. Dann wird leider auch in den ersten Button gezeichnet
statt in den zweiten in welchem ich den eigentlichen Code für dieses Feature erzeuge.
Durch das Auskoppeln dieses Formulars in eine eigene Anwendung würde ich dieses Problem umgehen.

Zitat:
Für ersteres gibt es hier eine gute Erklärung und sogar noch die Sourcen für die Komponenten:
Die scheinen unter Tokyo nicht zu funktionieren.
Ich bekomme alles in die IDE installiert und auch die Demo-Projekte kompiliert aber man kann keine Daten hin und herschicken (es kommt nichts an).

Geändert von SneakyBagels (29. Jun 2017 um 23:38 Uhr)
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
535 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 23:38
Man kann das auch über eine http-Verbindung lösen, z.B. mit Soap. Der die Daten sendet ist der Client, der andere der Server. Hätte den Vorteil dass beide Programme auch auf verschiedenen Rechnern laufen könnten.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#8

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 29. Jun 2017, 23:39
HTTP ist wirklich gut aber dann kommt wieder das leidige Thema SSL, Zertifikate usw.
Lokal würde mir absolut reichen es muss nur schnell genug sein.

Ansonsten habe ich noch das hier gefunden. Das wäre mit MemoryMapped files und sicherlich schneller als meine String-Bastelei:
http://www.michael-puff.de/Programmi...pets/MMF.shtml

Ich glaube ich habe jetzt eine für mich zufriedenstellende Lösung gefunden:
=> http://www.michael-puff.de/Programmi...COPYDATA.shtml
1) In einer Schleife von 0 bis 100 in Anwendung 1 setze ich die ProgressBar.Position in Anwendung 2. Das reine Senden der Daten (Record) dauert zwischen 3ms und 6ms.

2) In einer Schleife von 0 bis 24999 in Anwendung 1 setze ich Label1.Caption in Anwendung 2. Das dauert rund 4050ms 3600ms. Könnte schneller sein, reicht mir aber erst einmal.
Ohne IPC dauert das Setzen dieses Labels ~700ms.
Wenn ich in TReceiver.WMCopyData() das Label1.Caption := xyz; weglasse, bin ich auch bei 700ms. Heißt also der Sender wartet auf eine Antwort vom Receiver bevor es weitergeht?
Ich habe gerade mal zum Test das Ändern des Labels aus WMCopyData rausgenommen. Dort wird nur noch eine Variable gesetzt welche in einem Thread ausgelesen wird. Nun bin ich mit einem Sleep(1) im Thread und Synchronize() bei 850ms statt 3600ms.
Wenn jedoch zu schnell gesendet wird (abwechslend Action 0 und 1), kommt der Empfänger wohl irgendwie nicht hinterher und zeigt komische Zeichen im Label an.

Delphi-Quellcode:
// weil ich zu faul war, sind das globale Variablen
var
 aAction, iZahl: Integer;
 sZeichenkette: string;

procedure TFormReceiver.WMCopyData(var msg: TWMCopyData);
begin
 aAction := PMyData(msg.CopyDataStruct.lpData)^.Action;

 if aAction = 0 then
  begin
   iZahl := PMyData(msg.CopyDataStruct.lpData)^.Zahl;
   // ProgressBar1.Position := Zahl;
  end
 else if aAction = 1 then
  begin
   sZeichenkette := PMyData(msg.CopyDataStruct.lpData)^.Zeichenkette;;
   // Label1.Caption := Zeichenkette;
  end;
end;

procedure TGUISetter.Execute;
begin
 while not Terminated do // auch, weil ich zu faul war
  begin
   Sleep(1);

   if aAction = 0 then
    begin
     Synchronize(
       procedure
      begin
       FormReceiver.ProgressBar1.Position := iZahl;
      end);
    end
   else if aAction = 1 then
    begin
     Synchronize(
      procedure
      begin
       FormReceiver.Label1.Caption := sZeichenkette;
      end);
    end;
  end;
end;

Geändert von SneakyBagels (30. Jun 2017 um 01:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#9

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 30. Jun 2017, 09:24
Zitat:
Für ersteres gibt es hier eine gute Erklärung und sogar noch die Sourcen für die Komponenten:
Die scheinen unter Tokyo nicht zu funktionieren.
Ich bekomme alles in die IDE installiert und auch die Demo-Projekte kompiliert aber man kann keine Daten hin und herschicken (es kommt nichts an).
Kann ich nicht bestätigen. Ich habe hier in einfach

- das ZIP-Archiv entpackt
- die Projektgruppe in Tokyo geladen
- alle Projekte erzeugt
- die beiden Exe gestartet
- beim Client Connect geklickt
- Broadcast geklickt: Client meldet Received "Edit1"
- Send geklickt: Server meldet Rcvd "Edit1" mit der Client-ID

Das hat keine Minute gedauert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#10

AW: Schnelle Datenübertragung zwischen zwei Programmen

  Alt 30. Jun 2017, 09:41
Ich habe alles exakt gleich gemacht.

Zitat:
- beim Client Connect geklickt
- Broadcast geklickt: Client meldet Received "Edit1"
- Send geklickt: Server meldet Rcvd "Edit1" mit der Client-ID
Hier passiert bei mir nichts.

Eigentlich ist mir die Lösung mit WM_COPYDDATA lieber aber hier verschluckt sich der Code ab und zu.
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:20 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