![]() |
Nachrichtenfunktion für Threat erstellen und umleiten
Hallo und guten Tag an alle,
Habe jetzt in Ergänzung zu diesem ![]()
Delphi-Quellcode:
Außzug aus dem Tutorial
function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
lresult; stdcall; var x, y : integer; //Variablen für Fensterposition begin Result := 0; case uMsg of WM_CREATE: begin {Fenster zentrieren} x := GetSystemMetrics(SM_CXSCREEN); //Screenhöhe & -breite y := GetSystemMetrics(SM_CYSCREEN); {Fenster auf neue Position verschieben} MoveWindow(hWnd, (x div 2) - (WindowWidth div 2), (y div 2) - (WindowHeight div 2), WindowWidth, WindowHeight, true); end; else Result := DefWindowProc(hWnd,uMsg,wParam,lParam); end; end; Also wenn ich das richtig verstanden habe (ist in dem anfangs genannten Thread so gesagt worden) existiert eine solche Nachrichtenfunktion nicht für den TThread. Diese muss ich nach dem Muster aus dem Tut implementieren und dann eigentlich nur die hWnd von meinem Hauptthreat übergeben und in der Case-Abfrage meine eigenen WM´s dort definieren (also WM_User+1: schicke eine Nachricht an Hauptthreat, dass irgenwas hier im Thread passiert ist). Ist an dem, wie ich das verstanden hab eventuell noch ein Denkfehler oder habe ich da etwas falsch verstanden, weil eigentlich scheint es nicht schwer zu sein (was mich generell stutzig macht :lol: ). [Edit] OT t->d umgewandelt(hoffe hab alle gefunden :pale: )[/Edit] |
Re: Nachrichtenfunktion für Threat erstellen und umleiten
OT: Ich mag jetzt nicht kleinlich klingen, aber es heisst Thread (von Faden) und nicht threat (Bedrohung). ;-)
|
Re: Nachrichtenfunktion für Threat erstellen und umleiten
Also hab in Erinnerung an frühere Versuche über einen Thread ein Fenster zu schließen folgendes erstmal probiert, was aber erstmal noch nicht die erhoffte Reaktion gezeigt hat:
der Thread jetzt umgebaut:
Delphi-Quellcode:
Aufruf in der ControlerBoard-Klasse:
unit SteuerkartenKontrollThread;
interface uses Windows, Classes; Type TControlCardControlThread = class(TThread) private FFensterHandle: HWND; protected procedure Execute; override; public constructor create(MainHwnd: HWND); reintroduce; destructor destroy; override; end; implementation uses Steuerkarte; constructor TControlCardControlThread.create(MainHwnd: HWND); begin inherited create(false); FFensterHandle := MainHwnd; end; destructor TControlCardControlThread.Destroy; begin inherited destroy; end; procedure TControlCardControlThread.Execute; var c: integer; begin repeat c := GetTickCount; if ReadDigitalChannel(2) then PostMessage(FFensterHandle,WM_Nothalt,0,0); // einfache Postmessage an die Hauptform und somit in die Nachrichtenschleife in die ich ja eigentlich will. c := {interval}50 - (GetTickCount - c); if c > 0 then Sleep(c); until Terminated; end; end.
Delphi-Quellcode:
irgendwo scheint noch ein kleiner Fehler zu liegen, weil darauf noch nicht reagiert wird.
...
const WM_Nothalt = WM_User + 1; ... procedure NothaltMessage(var MSG: TMessage);message WM_Nothalt; ... constructor TControlerBoard.create; var iIndex: integer; begin inherited create; Eingangswaechter := TControlCardControlThread.create(Bedienform.Handle); //Initialisierung des Threads mit Übergabe des MainFormHandels for iIndex := 1 to 2 do Diodenhelligkeit[iIndex] := 150; bKamerabeleuchtung_angeschaltet := false; FbAnalogSignalOn := false; end; {////////////////////////////////////////////////////////////////////////////////////} {/ Nothaltfunktion /} {////////////////////////////////////////////////////////////////////////////////////} function TControlerBoard.Nothalt; begin try Spleissgeraet_ausschalten; // Spleißgerät Stromversorgung_Verschiebetische_ausschalten; // Stromversorgung Verschiebetische result := true except // doFehlerevent result := false; end; end; procedure TControlerBoard.NothaltMessage(var MSG: TMessage); begin Nothalt; end; |
Re: Nachrichtenfunktion für Threat erstellen und umleiten
Fehler gefunden, hab das aus der TControlerBoard-Klasse in die MainForm kopiert und dort funktioniert es wie gewünscht, nur die Problematik, dass sofort beim Laden des Programmes darauf reagiert wird, ist leider nicht gegeben. Nachrichtenschleife scheint in dem Zeitraum nicht abgearbeitet zu werden.
|
Re: Nachrichtenfunktion für Threat erstellen und umleiten
Hallo und guten Tag an alle,
keine Angst, dies ist kein Push. Wollte nur bemerken, dass nachdem ich meinen restlichen Quellcode für das Laden des Programmes gründlich auseinander genommen hab, ist mir folgendes aufgefallen:
Delphi-Quellcode:
Das Application.Processmessages hatte ich irgendwann mal auskommentiert, als ich das Problem hatte, dass mein SplashScreen bei dem eine For-Schleife für das Ein- und Ausblenden zuständig ist auch die ProzessMessages aufrief. Dies führte zu einem regelmäßigen Freeze des Splash´s und das Programm lief nicht mehr weiter. deswegen hatte ich dass damals auskommentiert.
// irgendwo in einer meiner Klassen habe ich folgende Dummheit begangen, welche zu dem Fehler führte
if Bewegtsich(1) or Bewegtsich(2) then begin repeat //application.processmessages; // <--- hier lag das Problem, warum das Programm die Nachrichtenschleife blockiert until (not Bewegtsich(1) ) and (not Bewegtsich(2)); Nachdem ich das Application.Processmessages wieder aktiviert hatte, konnte ich auch ohne Probleme wieder beim Laden des Programmes von meinem Thread in mein Hauptprogramm eingreifen. Die Kommunikation zwischen Thread und Hauptprogramm habe ich über 2 WM_User-Messages gelöst, das eine sagt dem Hauptprogramm, dass ein Nothalt ausgelöst werden soll, die andere dass der Nothalt gelöst werden kann. Sicher sind das keine "neuen" Erkenntnisse, habe es lediglich hier ergänzt, damit andere die über die SuFu hier her kommen auch wissen, wie ich das Problem ohne neue Nachrichtenfunktion lösen konnte. MfG BAMatze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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