Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hänger bei Sendmessage (https://www.delphipraxis.net/185786-haenger-bei-sendmessage.html)

Shark99 6. Jul 2015 15:27

Hänger bei Sendmessage
 
Ich will dass nur eine Instanz meiner App läuft. Dazu erzeuge ich einen Mutex.

Delphi-Quellcode:
MutexHandle := CreateMutex(nil, True, PROGNAME);
Dann überprüfe ich on eine Instanz schon da
Delphi-Quellcode:
if GetLastError = ERROR_ALREADY_EXISTS then
...
und schicke ihr eine Nachricht dass der User das Programm nochmal gestartet hat
Delphi-Quellcode:
            SendMessage( HWND_BROADCAST,
                        MyMsg,
                        MSG_STARTAGAIN,
                        0 );
Die alte Instanz emfängt die Nachricht problemlos und kann darauf reagieren (ohne die MessageQueue zu blockieren, es wird nur ein Timer gestartet).

Das ganze mit Delphi 2009 unter Win 7 x64.

Nun passiert aber merkwürdiges. Die neue Instanz hängt dauerhaft bei SendMessage und ich muss den Task mit den Taskmanager beenden.

Hab auch ohne IDE Log in eine Datei geschrieben und der Code nach SendMessage wird definitiv nicht ausgeführt.

Help!

Popov 6. Jul 2015 15:38

AW: Hänger bei Sendmessage
 
Schon lange nicht mehr mit SendMessage gearbeitet. Ist es nicht so, dass SendMessage so lange nicht zurückkehrt, bis es verarbeitet wurde?
Zitat:

Zitat von Delphi Hilfe
Die Funktion SendMessage sendet eine Meldung an ein oder mehrere angegebene Fenster.
SendMessage kehrt solange nicht zurück, bis die Meldung verarbeitet wurde. Die Funktion ruft die Fensterprozedur für das Fenster auf und kehrt solange nicht zurück, bis die Meldung verarbeitet wurde. Die Meldung wird, im Gegensatz zu der Funktion PostMessage, nicht in der Warteschlange plaziert.

Wie wäre es evtl. mit PostMessage?

Dalai 6. Jul 2015 15:41

AW: Hänger bei Sendmessage
 
Ich mache das so ähnlich, nur mit einigen kleinen Unterschieden:
Delphi-Quellcode:
LimitInstancesMsg:= RegisterWindowMessage(PChar('LimitInstanceMessage.' + PRODUCTNAME));

hMutex:= CreateMutex(nil, True, PRODUCTNAME + PRODUCTNAME + PRODUCTCOPYRIGHT);
if GetLastError = ERROR_ALREADY_EXISTS then
begin
    SendMessage(HWND_BROADCAST, LimitInstancesMsg, 0, 0);
    Exit;
end;
Prinzipiell hat aber SendMessage, gerade bei einem Broadcast, das Problem, dass es erst zurückkehrt, wenn alle Fenster die Nachricht empfangen und verarbeitet haben (wie auch in meinem Code). Mögliche Lösungen: PostMessage statt SendMessage benutzen oder Fenster aller eigenen Instanzen suchen und die Message nur an diese senden.

MfG Dalai

Shark99 6. Jul 2015 17:53

AW: Hänger bei Sendmessage
 
PostMessage() kommt leider nicht in Frage, weil es kein Broadcast unterstützt.

Habe aber eine gute Lösung gefunden und zwar SendMessageTimeOut().

DeddyH 6. Jul 2015 17:58

AW: Hänger bei Sendmessage
 
Zitat:

Zitat von Shark99 (Beitrag 1307853)
PostMessage() kommt leider nicht in Frage, weil es kein Broadcast unterstützt.

Da sagt das MSDN aber etwas anderes:
Zitat:

HWND_BROADCAST
((HWND)0xffff)


The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.

Luckie 6. Jul 2015 18:01

AW: Hänger bei Sendmessage
 
Warum ballerst du alle Fenster mit der Nachricht zu? Such dir das Handle deines Fenster und schicke es nur an dein Fenster.

Shark99 6. Jul 2015 18:11

AW: Hänger bei Sendmessage
 
Zitat:

Zitat von DeddyH (Beitrag 1307856)
Zitat:

Zitat von Shark99 (Beitrag 1307853)
PostMessage() kommt leider nicht in Frage, weil es kein Broadcast unterstützt.

Da sagt das MSDN aber etwas anderes:
Zitat:

HWND_BROADCAST
((HWND)0xffff)


The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.

Funktioniert definitiv nicht. Habs schon vor Jahren ausführlich getestet. Man kann es absetzen, aber nichts kommt an.

DeddyH 6. Jul 2015 18:39

AW: Hänger bei Sendmessage
 
Komisch, hier z.B. hat es funktioniert.

Shark99 6. Jul 2015 18:44

AW: Hänger bei Sendmessage
 
Genauer gesagt funktioniert es nur mit System Messages, nicht mit User Messages.

Bernhard Geyer 6. Jul 2015 18:46

AW: Hänger bei Sendmessage
 
Zitat:

Zitat von Luckie (Beitrag 1307859)
Warum ballerst du alle Fenster mit der Nachricht zu? Such dir das Handle deines Fenster und schicke es nur an dein Fenster.

Mit einer entsprechenden Umstellung heben wor vor Jahren auch den Hänger weg bekommen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Seite 1 von 2  1 2      

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