Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Nachrichtenfunktion für Threat erstellen und umleiten (https://www.delphipraxis.net/139652-nachrichtenfunktion-fuer-threat-erstellen-und-umleiten.html)

BAMatze 2. Sep 2009 08:28


Nachrichtenfunktion für Threat erstellen und umleiten
 
Hallo und guten Tag an alle,

Habe jetzt in Ergänzung zu diesem Thread die Problematik, dass meine Nachrichten vom Threat in den Hauptthread "umgeleitet" werden müssen. Habe mir dazu schon einen Teil von Luckie´s Tut Win32Api angeschaut. Dabei ist mir zumindest erstmal eine Idee gekommen, wie ich glaube das Problem lösen zu können und wollte (bevor ich Stunden mit Umsetzung und Troubleshooting verbringe, um dann eventuell heraus zu finden, dass der Weg nicht funktioniert) nachfragen, ob der Weg umsetzbar ist oder eventuell total falsch oder elegantere Lösungen existieren.

Delphi-Quellcode:
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;
Außzug aus dem Tutorial

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]

Phoenix 2. Sep 2009 08:32

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). ;-)

BAMatze 2. Sep 2009 10:06

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:
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.
Aufruf in der ControlerBoard-Klasse:
Delphi-Quellcode:
...
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;
irgendwo scheint noch ein kleiner Fehler zu liegen, weil darauf noch nicht reagiert wird.

BAMatze 2. Sep 2009 10:27

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.

BAMatze 3. Sep 2009 07:44

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:
// 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));
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.
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 01:34 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