AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi AllocateHWnd/PostMessage klappt nicht
Thema durchsuchen
Ansicht
Themen-Optionen

AllocateHWnd/PostMessage klappt nicht

Ein Thema von s.h.a.r.k · begonnen am 11. Jun 2010 · letzter Beitrag vom 11. Jun 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AllocateHWnd/PostMessage klappt nicht

  Alt 11. Jun 2010, 17:25
Hallo zusammen,

und zwar habe ich einen MainThread, die diverse andere Threads anstößt, um Daten zu laden, Einstellungen zu tätigen etc. Nun habe ich einen ApplicationController, der via AllocateHWnd() ein Handle erzeugt und in den Controller speichert. Daneben habe ich einen StartupThread, der beim Start alles nötige in die Wege leitet und via SendMessage und PostMessage mit dem MainThread kommuniziert. Das Handle selbst bleibt bis zum Ableben des Programms bestehen und wird es dann freigegeben.

Nun hab ich einen StorageController, der die verwaltung der Business-Objekte übernimmt. Diesem habe ich nun auch einen Load-Thread spendiert. Der StorageController bekommt ebenso ein Handle; ein Auszug:
Delphi-Quellcode:
const
  WM_LOAD_DATA = WM_USER + 1;

type
TStorageController = class(TStorageContainer)
private
  FHandle : HWND;
  FLoadThread : TStorageLoadThread;
  procedure WndProc(var Msg:TMessage);
  procedure CallLoadEvent(var Msg: TMessage); message WM_LOAD_DATA;
public
  constructor Create(const ADatabaseController: TDatabaseController; const ABlock: TBlock); reintroduce;
  destructor Destroy(); override;
end;

{ ... }

procedure TStorageController.WndProc(var Msg:TMessage);
begin
  Dispatch(Msg);
end;

procedure TStorageController.CallLoadEvent(var Msg: TMessage);
var
  LoadState : TLoadState;
  ErrorMessage : PString;
  ProgressInfo : PLoadProgressInfo;
begin
  if (Msg.Msg = WM_LOAD_DATA) then
  begin
    { Hier kommt noch einiges an weiterem Code
      zur Verarbeitung der Nachrichten }

  end;
end;

constructor TStorageController.Create(const ADatabaseController: TDatabaseController; const ABlock: TBlock);
begin
  inherited Create(ADatabaseController, ABlock);

  // Handle für Kommunikation mit Load-Thread anlegen
  FHandle := Classes.AllocateHWnd(Self.WndProc);

  // Test-Nachricht schicken
  PostMessage(FHandle, WM_LOAD_DATA, 0, 0);
end;

destructor TStorageController.Destroy();
begin
  // Handle für Load-Thread-Kommunikation freigeben
  DeallocateHWnd(FHandle);

  inherited Destroy();
end;
Exakt auf diese Art und Weise habe ich das auch bei meinem ApplicationController gemacht. Dort bekomme ich auch alle Nachrichten aus dem nebenher laufenden Thread. Nur hier eben nicht. Im Constructor habe ich eine Demo-Nachricht an das Handle geschickt, welches aber nie in der WndProc-Methode ankommt.

Ich habe schon gelesen, dass Windows 7 hier evtl. Rechte setzt oder sowas in der Art, aber warum funktioniert das Ganze dann im ApplicationController und hier auf einmal nicht? Ich finde es nur noch seltsam
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: AllocateHWnd/PostMessage klappt nicht

  Alt 11. Jun 2010, 18:09
Wird dein TStorageController vielleicht in einem Thead erzeugt der nicht der Mainthread ist?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: AllocateHWnd/PostMessage klappt nicht

  Alt 11. Jun 2010, 18:23
Jo. Mache ich, eben im schön erwähnten Startup-Thread. Wobei der Startup-Thread danach ja freigegeben wird.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: AllocateHWnd/PostMessage klappt nicht

  Alt 11. Jun 2010, 19:34
Tatsache Es liegt daran, dass ich das Handle in einem anderen Thread erzeuge. Mir war nicht bewusst, dass Handles Kontextabhängig sind. Jetzt hab ich die Erzeugung des TStorageControllers mit dem MainThread synchronisiert und siehe da, schon klappt die Nachrichtenschleife. Tja, wenn man sowas nicht weiß, brauch man sich gar nicht wundern. Danke nochmals für den Hint
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  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 16:51 Uhr.
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