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)