Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread stoppt nicht? (https://www.delphipraxis.net/41017-thread-stoppt-nicht.html)

Zerolith 24. Feb 2005 17:37


Thread stoppt nicht?
 
Tag!

ich hab mir heut ein kleines Threadobjekt erstellt. Joa.. funktioniert soweit auch bloß bekomm ich kein OnTerminate Ereignis:
Delphi-Quellcode:
unit uSyncThread;

interface

uses
  Classes, ZMySQLProxyUnit, uConsole;

type
  TZSyncThread = class(TThread)
  private
    FResult : TZResult;
    procedure WriteDone();
    procedure WriteError;
  public
    SQL : TZMySQLProxy;
    Console : TZConsole;
    Constructor Create(ASQL : TZMySQLProxy; AConsole : TZConsole);
  protected
    procedure Execute; override;
  end;

implementation

{ ZSyncThread }

constructor TZSyncThread.Create(ASQL : TZMySQLProxy; AConsole : TZConsole);
begin
  Console := AConsole;
  SQL := ASQL;
  inherited Create(False);
end;

procedure TZSyncThread.Execute;
begin
  SQL.SQL := 'SELECT * FROM z_wct_configs';
  FResult := SQL.Execute;
  if FResult.ZMessageType = zError then
    Synchronize(WriteError)
  else
    Synchronize(WriteDone) // Normalerweiße wird hier "gestoppt" die WriteDone wird nicht aufgerufen
                           
end;

procedure TZSyncThread.WriteDone;
begin
  Console.WritelnEx('[ DONE ]');
end;

procedure TZSyncThread.WriteError;
begin
  Console.WritelnEx('[ ERROR ]');
  Console.WritelnEx(FResult.ZMessage);
end;

end.
Es gibts auch keine Fehler meldung - nur im Hauptprogramm - in einer Schleife wo geprüft wird ob der Thread fertig ist läuft alles weiter.

bitte um hilfe!!!
danke,
Daniel

Zerolith 24. Feb 2005 20:35

Re: Thread stoppt nicht?
 
Sorry dass ich pushe - Aber der Topic is schon so weit zurück gerutscht und es ist (für mich) ziemlich wichtig!

kann mir keiner helfen?

Luckie 24. Feb 2005 22:25

Re: Thread stoppt nicht?
 
Auch wenn es für dich wichtig ist, ist es unerwünscht Beiträge innerhalb von 24 Stunden zu "pushen". Stell deine Frage das nächste mal eben früher.

sniper_w 24. Feb 2005 23:40

Re: Thread stoppt nicht?
 
Zitat:

funktioniert soweit auch bloß bekomm ich kein OnTerminate Ereignis:
Du hast ja kein implementiert.

Zerolith 24. Feb 2005 23:48

Re: Thread stoppt nicht?
 
ja sorry - eh hab ich in ner anderen unit - die die den Thread erstellt.

Hab grad festgestellt dass die Unit "funktionier" sobald sie in ner VCL Anwendung ist - bei mir is es jetzt z.Zt eine Konsolenanwendung (sollte doch eigtl keinen Unterschied machen?) die später zum SystemService ausgebaut wird.

Edit: Ach und eh: wenn ich Syncronize aufrufe stoppt er sofort. (alles ausser dem Thread läuft weiter)

cya

m.wollert 24. Feb 2005 23:53

Re: Thread stoppt nicht?
 
Zitat:

Du hast ja kein implementiert.
Kommt drauf an. Wenn er "extern" etwas handeln möchte, dann benötigt er nur einen entsprechenden Event-Handler. Kann ja sein, daß er den nicht überschreiben möchte. Es wäre jetzt noch interessant, wie die Instanz des Threads erstellt wird.

Michael:)

Zerolith 24. Feb 2005 23:59

Re: Thread stoppt nicht?
 
Delphi-Quellcode:
...
procedure ThreadIsDone(Sender : TObject);
...
With TSyncThread.Create(Console, DB) do OnTerminate := ThreadIsDone;
is grad ausm Kopf muss nicht 100% korrekt sein

m.wollert 25. Feb 2005 00:07

Re: Thread stoppt nicht?
 
Innerhalb Deines Creates wird der Thread direkt ausgeführt -- kann sein, daß der Event-Handler hier schon garnicht mehr gesetzt wird, weil der Thread bereits durch ist... Kann mich aber auch täuschen.

Versuche es mal mit dem abgeleiteten Create:

Delphi-Quellcode:
inherited Create(TRUE);
und in Deinem With-Block so:

Delphi-Quellcode:
With TSyncThread.Create(Console, DB) do
begin
  OnTerminate := ThreadIsDone;
  Resume;
end;
[edit] Vor allem sollte FreeOnTerminate noch gesetzt werden, weil sonst der Speicher nicht mehr freigegeben wird! ;) [/edit]


Fehlt in der Abfrage nicht ein abschliessendes Semikolon? (*Nur mal so frag*)

Delphi-Quellcode:
SQL.SQL := 'SELECT * FROM z_wct_configs[b];[/b]';

Zerolith 25. Feb 2005 00:18

Re: Thread stoppt nicht?
 
Zitat:

Zitat von m.wollert
Innerhalb Deines Creates wird der Thread direkt ausgeführt -- kann sein, daß der Event-Handler hier schon garnicht mehr gesetzt wird, weil der Thread bereits durch ist... Kann mich aber auch täuschen.

Versuche es mal mit dem abgeleiteten Create: // HAB ICH SCHONMAL

Delphi-Quellcode:
inherited Create(TRUE);
und in Deinem With-Block so: // DITO

Delphi-Quellcode:
With TSyncThread.Create(Console, DB) do
begin
  OnTerminate := ThreadIsDone;
  Resume;
end;
[edit] Vor allem sollte FreeOnTerminate noch gesetzt werden, weil sonst der Speicher nicht mehr freigegeben wird! ;) [/edit]


Fehlt in der Abfrage nicht ein abschliessendes Semikolon? (*Nur mal so frag*) // Eigtl nur wenn mehr als eine SQL Anweißung sonst kann man das imho weglassen

Delphi-Quellcode:
SQL.SQL := 'SELECT * FROM z_wct_configs[b];[/b]';

Aber Danke

xman 25. Feb 2005 09:25

Re: Thread stoppt nicht?
 
Zitat:

Zitat von Luckie
Auch wenn es für dich wichtig ist, ist es unerwünscht Beiträge innerhalb von 24 Stunden zu "pushen". Stell deine Frage das nächste mal eben früher.


sag mal, ich bin zwar noch nicht lange hier aber dein angekotze von irgendwelchen Leuten in verschiedenen Threads fällt mir auch schon negativ in der ersten Woche auf. Schade das es so Leute gibt.

lume96 25. Feb 2005 10:54

Re: Thread stoppt nicht?
 
Zitat:

Zitat von xman
Zitat:

Zitat von Luckie
Auch wenn es für dich wichtig ist, ist es unerwünscht Beiträge innerhalb von 24 Stunden zu "pushen". Stell deine Frage das nächste mal eben früher.


sag mal, ich bin zwar noch nicht lange hier aber dein angekotze von irgendwelchen Leuten in verschiedenen Threads fällt mir auch schon negativ in der ersten Woche auf. Schade das es so Leute gibt.

Sorry, wenn ich jetzt OT werde, aber dass konnte ich so nicht stehen lassen.

1) Es ist allgemein bekannt, dass innerhalb von 24 Stunden nicht "gepushed" wird. Lukie, als Moderator, hat durchaus das Recht, darauf hinzuweisen. Es gibt bestimmte Regeln, die dazu dienen, dass ein Forum so läuft, wie es laufen sollte. Die Moderatoren sind dazu da, zu überprüfen, dass diese Regeln eingehalten werden.

2) Die Art und Weise, wie auf diese Regel hingewiesen wurde, war doch sehr sachlich; von "ankotzen" kann da nicht die Rede sein.

3) Wenn es Leute wie Lukie (neben vielen Anderen) nicht gäbe, die viel Zeit investieren um :
a) Leuten mit Rat zur Seite zu stehen
b) darauf zu achten, das alles läuft, wie es laufen sollte,
dann gäbe es die DP nicht.

So, das musste ich jetzt mal loswerden.

Tschüss,
Lutz

Zerolith 25. Feb 2005 10:56

Re: Thread stoppt nicht?
 
Er hat ja recht.

Zwar ist die aussage "Stell deine Frage eben früher" n bissl doof ist da ich keine problemstellung vor dem Problem nennen kann aber egal. Aber trotzdem es ist ja berechtigt

Edit: Das ganze bezieht sich auf xman. Lume96 war schneller

Zerolith 1. Mär 2005 21:34

Re: Thread stoppt nicht?
 
ich vermute mal dass ich herausgefunden hab wo mein problem ist:

da das ganze ja ne Konsolen anwendung und soll später zum System Dienst ausgebaut werden.

Ja. mein problem liegt wohl darin dass ich keine Nachrichtenschleife hab. Und so die Ereignisse nicht aufgerufen werden.

Joa. hab mich mal mit meinem bisschen wissen dran gemacht und folgendes gemacht:

Delphi-Quellcode:
program TestConsole;
{$APPTYPE CONSOLE}

uses
  Windows, uCommunication, Messages;

const Z_INIT = 0;
      Z_START = 1;
      Z_DO = 2;

var msg: TMsg;
    lastmessage : integer = 0;
    zComm : TZCommunication;
   
procedure ZDispatcher(ZMessage : Integer);
begin
 Case ZMessage of
    Z_INIT:
    begin
      Writeln('Init');
      SendMessage(0, Z_START, 0,0); // HIER
    end;
    Z_START:
    begin
      Writeln('Start');
      zComm := TZCommunication.Create;
      zComm.Active := TRUE;
    end;
  end;
end;

begin
  ZDispatcher(0);
  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
    ZDispatcher(msg.message);
  end;
  ExitCode := msg.wParam;
end.
So... das ganze kann wohl noch nicht funkionieren da ich kein HWND (Handle?) habe (siehe "// HIER")
Kann mir bitte jemand helfen und mir sagen - ob ich
A, richtig liege
B, mir helfen dieses Programm soweit zu bringen dass was passiert?

(bei dem ZComm.Active müsste z.B. sich das ereignis "OnConnect" melden - tuts aber nicht)

Danke
Daniel


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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 by Thomas Breitkreuz