Einzelnen Beitrag anzeigen

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