AGB  ·  Datenschutz  ·  Impressum  







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

Nachrichtenschleife bauen?

Ein Thema von geskill · begonnen am 8. Okt 2012 · letzter Beitrag vom 8. Okt 2012
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 17:51
bei
PostMessage(FHandle, WM_CONTROL_VALUE_CHANGE, Integer(AValue), 0); ist der Zeiger auf AValue als Stackwert ungültig bis die Message abgearbeitet wird,da SetValue bereits wieder verlassen wurde.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 18:02
bei PostMessage(FHandle, WM_CONTROL_VALUE_CHANGE, Integer(AValue), 0); ist der Zeiger auf AValue als Stackwert ungültig bis die Message abgearbeitet wird, da SetValue bereits wieder verlassen wurde.
Das wollte ich auch grade sagen

Dann noch das Gecaste mit dem bösen Integer.
Nimm stattdessen den Typ LPARAM, bzw. WPARAM, LRESULT oder eben NativeInt und Co.

Statt SendMessage kannst du auch Perform nutzen.
Delphi-Quellcode:
SendMessage(FHandle, WM_CONTROL_VALUE_CHANGE, LPARAM(AValue), 0);

Perform(WM_CONTROL_VALUE_CHANGE, LPARAM(AValue), 0);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 18:16
@DeddyH
Ja das hatte ich letztens schonmal gesehen. Hört sich sehr interessant an.

@Bummi
Das muss man natürlich erstmal verinnerlichen. Wenn ich danach nun ein Application.ProcessMessages; funktioniert es. Aber ich glaube wenn das ein Thread aufruft ist das nicht so gut. Ich weiß gerade auch nicht so genau.

@himitsu
Okay habe den Integer verbannt und WPARAM Einzug halten lassen (aber das wäre ja sowieso nur für x64 interessant)

Auf Perform kann ich ja gar nicht zugreifen (ist ja kein TControl).
Delphi-Quellcode:
  TIBasic = class(TInterfacedObject, IBasic)
  protected
    FEdit: TcxTextEdit;
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 18:21
Warum nicht so?
Delphi-Quellcode:

procedure TIBasic.SetValue(AValue: WideString);
begin
  FValue:=AValue;
  PostMessage(FHandle, WM_CONTROL_VALUE_CHANGE, 0, 0);
end;


if Msg.Msg = WM_CONTROL_VALUE_CHANGE then
  begin
    SetControlValue(FValue);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 18:33
Warum nicht so?
Rufe jetzt mehrmals hintereinander diese Methode auf.
Das macht viel Sßaß, wenn zwischenzeitlich keine Messages verarbeitet wurden (es gehen informationen verloren).
Und wenn man das jetzt auch noch per multithread macht, dann geht voll die Post ab.

Zitat:
Wenn ich danach nun ein Application.ProcessMessages; funktioniert es. Aber ich glaube wenn das ein Thread aufruft ist das nicht so gut. Ich weiß gerade auch nicht so genau.
Was mag da wohl passieren?
PostMessage schreibt das in die MessageQueue und ProcessMessages arbeitet diese Queue ab.
Natürlich wird das dann rechtzeitig abgarbeitet, bevor der Zeiger ungültig wird ... es werden allerdings alle Messages in der Queue verarbeitet. (und im Thread geht das eh nicht)

Was macht denn nun SendMessage?
Es schickt auch diese Nachricht los, aber dieses wird quasi sofort verarbeitet, bevor dieser Aufruf zurückkehrt. Und es wird NUR diese Nachricht verarbeitet und sonst nix (außer der MessageHandler ruft in sich ein ProcessMessages auf)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Nachrichtenschleife bauen?

  Alt 8. Okt 2012, 18:57
SendMessage() ist aber auch blockierend.

SetValue() müsste dann nur den Wert in einer Liste (Schlange) speichern bis er in WndProc() abgearbeitet wurde. Dort wird der dann entfernt. So gehen keine Daten verloren.
Sebastian
  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 20:26 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