AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Message korrekt behandeln

Ein Thema von KodeZwerg · begonnen am 21. Mai 2018 · letzter Beitrag vom 19. Sep 2022
Antwort Antwort
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 13:37
Ich stelle mir gerade auch die Frage wie man eine Message korrekt abarbeitet.
In einem TThread sende ich mit PostMessage den aktuellen Progress in % an WndProc
Delphi-Quellcode:
if ProgressPercent > ProgressPercentOld then
 begin
  PostMessage(FDestinationWindowHandle, WM_PB_MAIN, ProgressPercent, WM_PB_SET_HINT);
  ProgressPercentOld := ProgressPercent;
 end;
Mein WndProc
Delphi-Quellcode:
procedure TForm1.WndProc(var msg: TMessage);
begin
 if TMessageHandlerThreads.WndProc(msg) then
  Dispatch(msg);

 inherited;
end;

function TMessageHandlerThreads.WndProc(msg: TMessage): Boolean;
begin
 Result := False;

 case msg.msg of
  WM_PB_MAIN:
   begin
    MainForm.ProgressBar1.Position := msg.WParam;

    case msg.LParam of
     WM_PB_SET_HINT:
      MainForm.ProgressBar1.Hint := IntToStr(msg.WParam) + '%';
    end;

    Result := True;
   end;
 end;
end;
Es gibt auf anderen Computern, wohl sehr selten, das Problem, dass der Progress direkt auf 100% springt.
Da mir die Leute die das Problem haben aber nie alle Details nennen und ich alles mühselig erfragen muss, habe ich sonst keine Ahnung wie das Problem bei denen aussieht.

Das DispatchMessage(msg); in WndProc habe ich eben hinzugefügt in der Hoffnung, dass das problem weg ist.
Fehlt da sonst noch irgendwas?

Es kommt in den Logs auch Fehler #1444 - aber nur auf manchen Rechnern, nicht bei allen. Ich vermute das sind alles Win11 PCs.

In einem anderen Thread lese ich:
Zitat:
Auf MSDN erfährt man zu Postthreadmessage: "The function fails if the specified thread does not have a message queue."
Ein try-except um mein PostMessage, wäre das eine Idee?

Geändert von DieDolly (18. Sep 2022 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#2

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 15:22
Warum behandelst du nicht einfach gezielt diese eine Message und überlässt Delphi den Rest?
Delphi-Quellcode:
procedure WmPbMain(var msg: TMessage); message WM_PB_MAIN;

...

procedure TForm1.WmPbMain(var msg: TMessage);
begin
  ProgressBar1.Position := msg.WParam;

  case msg.LParam of
    WM_PB_SET_HINT:
      ProgressBar1.Hint := IntToStr(msg.WParam) + '%';
  end;
end;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#3

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 15:25
Die Position könnte man auch direkt an das ProgressBar-Handle schicken,
SendMessage(Handle, PBM_SETPOS, Value, 0) falls es auch mit PostMessage geht. (vermutlich)


Ein try-except um mein PostMessage, wäre das eine Idee?
Natürlich nicht.

PostMessage arbeitet garnicht mit Exceptions.
Wie man in der "Hilfe" lesen kann, ist es wie bei dein meisten WinAPI's:
Result und eventuell noch GetLastError, jenachdem ob Result sagt dort wäre was.


Zitat:
Das DispatchMessage(msg); in WndProc habe ich eben hinzugefügt in der Hoffnung, dass das problem weg ist.
Fehlt da sonst noch irgendwas?
Da ist eher zuviel.

Was soll Dispatch/DispatchMessage mit "deiner" Message anfangen?
Es kennt deine Message garnicht, also kann es auch nichts machen.



Schonmal auf die Idee gekommen zu schauen was 1444 ist?

ERROR_INVALID_THREAD_ID

Hier sieht man nichts dazu, aber nun weißt du ja, in welcher Richtung du im restlichen Code suchen kannst.

Aber natürlich hast du garnicht gesagt, "was" das für ein Fehlercode ist, bzw. wo er her kommt.
Ist es kein Win32-LastError, dann kann es auch was anderes bedeuten.




Zum Springen:
Es kann sein, dass du schneller schickst, als die Messages verarbeitet werden,
also kann es sein, dass alle Messages praktisch gleichzeitig (ganz schnell nacheinander) verarbeitet wird.

Und wie jeder weiß, animiert Windows die ProgrssBars, also nach oben dauert es etwas, bzw. wenn ganz viele Messages gleichzeitig eintreffen, kann es ruckzuck in einem Schritt auf 100 gehn.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Sep 2022 um 15:28 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 15:45
Zitat:
Warum behandelst du nicht einfach gezielt diese eine Message und überlässt Delphi den Rest?
Ich verstehe den Kontext nicht. Wo soll diese Prozedur hin und sein? Was ist der Unterschied zu meiner WndProc?
Ich habe nicht nur eine Message sondern 5, deswegen habe ich ein case in WndProc.

Mein Problem hierbei ist, dass das bei nur einer einzigen Person passiert. Was 1444 bedeutet habe ich schon nachgeguckt, kann damit aber nix anfangen und auch nicht sehen, wo ich anfangen soll zu suchen.

Geändert von DieDolly (18. Sep 2022 um 16:02 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 16:04
Zitat:
kann damit aber nix anfangen
Hmmm.. Du verstehst nicht das die Thread ID ungültig ist?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Message korrekt behandeln

  Alt 18. Sep 2022, 16:06
Natürlich verstehe ich das! Aber wo soll ich anfangen zu suchen, wenn der Fehler bei mir nicht auftritt und ich auch sonst keine Informationen habe.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.076 Beiträge
 
Delphi 12 Athens
 
#7

AW: Message korrekt behandeln

  Alt 19. Sep 2022, 21:16
Logging einbauen. Von allen Threads die IDs reinschreiben und jeweils wenn er beendet wird. Damit müsste man finden welcher Threads früher als gedacht beendet wird.
  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 19:20 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