![]() |
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:
Es das funktioniert auch wunderbar und ohne Probleme, nur flackert mein Programm unschön und es dauert ziemlich lange, um alle Dateien einzulesen.
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. 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 |
Re: Mutex und Parameterweitergabe
Moin Moin,
Hmm?Sender sollte OK sein? Wie sieht den die Empfängerseite aus ??? |
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