Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mutex und Parameterweitergabe (https://www.delphipraxis.net/90004-mutex-und-parameterweitergabe.html)

Flare 10. Apr 2007 11:49


Mutex und Parameterweitergabe
 
Hey ho!


Ich habe ein klitzekleines Schönheitsproblem mit einem meiner Programme.

Da dieses Programm bloß ein mal offen sein soll, habe ich es mit Mutex ausgestattet und lasse die Parameter an die erste Instanz des Programmes weitergeben.

Delphi-Quellcode:
program Test;

uses
  Windows,
  Sysutils,
  Forms,
  haupt in 'haupt.pas' {Form1};

{$R *.res}

var
//dwMessage: DWORD; (ist in unit haupt deklariert)
  dwMutex : DWORD;
  hWindow : DWORD;
  dwAtom  : DWORD;

begin
  dwMessage := RegisterWindowMessage('{93C5B2B7-CE8D-439A-857B-4CC76F35C091}'); // Eigene Message erzeugen
  dwMutex  := CreateMutex(nil,true,'Test'); // Schauen, ob das Programm schon mal läuft
  try
    if GetLastError <> ERROR_ALREADY_EXISTS then // Wenn nicht, dann
    begin
      Application.Initialize; // Anwendung ganz normal starten
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end
    else // Falls doch...
    begin
      hWindow := FindWindow(nil, 'Testprogramm'); // Das Hauptfenster finden
      if hWindow <> 0 then // Falls das Fenster gefunden wurde
      begin
        if (paramcount > 0) and FileExists(paramstr(1)) then // Parameter zählen
        begin
          dwAtom := GlobalAddAtom(PChar(paramstr(1))); // Den ersten in der Atomliste aufnehmen
          SendMessage(hWindow,dwMessage,0,dwAtom); // Und dem Fenster den Zeiger auf dieses Atom schicken
        end;
      end;
    end;
  finally
    if dwMutex <> 0 then CloseHandle(dwMutex); // Mutex wieder schließen
  end;
end.
Es das funktioniert auch wunderbar und ohne Probleme, nur flackert mein Programm unschön und es dauert ziemlich lange, um alle Dateien einzulesen.

Deswegen habe ich versucht, mir eine kleine nonVCL-Exe zu schreiben, die das ganze (so hatte ich gehofft) schneller ausführt, aber die hat fast genau so lange gebraucht und es sind unterwegs auch noch Dateinamen abhanden gekommen. Das hat also nicht geklappt.

Nun meine Frage:
Gibt es eine Möglichkeit das ganze zu beschleunigen oder zu optimieren?

Danke für alle Antworten!


Flare

yörsch 10. Apr 2007 11:56

Re: Mutex und Parameterweitergabe
 
Moin Moin,
Hmm?Sender sollte OK sein?
Wie sieht den die Empfängerseite aus ???

Flare 10. Apr 2007 12:25

Re: Mutex und Parameterweitergabe
 
Ich weiß zwar jetzt nicht, was du mit Sender meinst, aber so sieht der Empfang und die Verarbeitung aus (unit haupt):

Delphi-Quellcode:
procedure TForm1.WndProc(var msg : TMessage);
var
  pFileName : PChar;
  dwLen    : DWORD;
begin
  if msg.Msg=dwMessage then // Wenn die erhaltene Message wirklich die Message mit dem Parameter ist...
  begin
    dwLen    := MAX_PATH+1;
    pFileName := StrAlloc(dwLen); // Speicher anfordern
    try
      GlobalGetAtomName(msg.lParam,pFileName,dwLen); // Parameter holen

      Files.Add(pFileName); // Parameter verarbeiten

      GlobalDeleteAtom(msg.lParam); // Parameter aus der Atomliste löschen
    finally
      StrDispose(pFileName); // Speicher wieder freigeben
    end;
  end
  else inherited WndProc(msg); // Andere Nachrichten darf jemand anderes verarbeiten
end;

Flare


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 Uhr.

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