AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi warten bis Thread keine Jobs mehr hat.....
Thema durchsuchen
Ansicht
Themen-Optionen

warten bis Thread keine Jobs mehr hat.....

Ein Thema von Thomas83 · begonnen am 30. Okt 2008 · letzter Beitrag vom 31. Okt 2008
Antwort Antwort
Seite 1 von 3  1 23      
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#1

warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 12:29
Servus,

habe da einen Thread. In einer Stringliste speicher ich die jobs ab.
Wenn ich meine Anwendung beende, möchte ich noch warten bis alle Jobs verarbeitet wurden.
also bis count = 0 ist. Nur irgend wie funzt dat nicht so kanz... (funzt nur mit application.processmessage)

hier mal ein wenig code
Delphi-Quellcode:
  TSqlThread = class(TThread)
  private
    fSQLTimer : TTimer;
    Procedure OnSqlTimer(Sender : TObject);
  public
    Function IsEmpty : Boolean;
  protected
    Procedure Execute; override;
  end;


function TSqlThread.IsEmpty: Boolean;
begin
  result := fSqlList.Count-1 <= 0;
end;

procedure TSqlThread.OnSqlTimer(Sender: TObject);
begin
  if fSqlList.Count-1 >= 0 then
  begin
    fcs.Enter;
    try
      fDB.SQLQuery(fSqlList[0]);
      fSqlList.Delete(0);
    finally
      fcs.Leave;
    end;
    if Assigned(fOnWriteSQL) then
      Synchronize(fOnWriteSQL);
  end;
end;

procedure TSqlThread.Execute;
var
  MSG : TMsg;
begin
  inherited;

  while ( GetMessage(msg, 0, 0, 0) ) do
    DispatchMessage(msg);
end;

// aus meiner main rufe ich bei einem thread diese methode auf.
begin
  if fsql <> nil then
    while not fsql.IsEmpty do
    begin
      sleep(100);

      //muss ich machen weil sonst OnSqlTimer nicht aufgerufen wird..
      application.ProcessMessages; //was aber nicht sein darf
    end;
end;
Wenn ich es ohne application.ProcessMessages mache friert meine main auch ein.
Bzw. der Timer vom SQLThread wird nicht aufgerufen......

Mache ich was falsch?
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#2

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 13:11
Wieso eigentlich Count-1?

Delphi-Quellcode:
function TSqlThread.IsEmpty: Boolean;
begin
  result := fSqlList.Count = 0;
end;
Sonst würde ja eine Liste, die noch ein Element enthält auch schon als leer interpretiert werden.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 13:26
Wo erstellst du denn den Timer?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#4

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 13:28
Zitat von sirius:
Wo erstellst du denn den Timer?
im Thread bei Create
Delphi-Quellcode:
constructor TSqlThread.Create(Host,User,Pass,Db : String);
begin
  inherited Create(false);

  fSQLTimer := TTimer.Create(nil);
  fSQLTimer.Interval := 100;
  fSQLTimer.OnTimer := OnSqlTimer;
  fSQLTimer.Enabled := true;
end;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 13:35
Damit ist er im MainThread. Du must ihn in execute erstellen.

btw: Wenn Dein Thread außer dem Timer nichts beinhaltet bzw. den Rest synchronisiert, bringt dir der Timer nichts. du musst alles in den Thread nehmen oder du lässt es mit dem Thread.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#6

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 13:39
aso wuste nicht wenn ich ein object in der create eines Threads anlege das es dann im mainthread ist.....

thx
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#7

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 14:05
habe 4 Threadklassen ..... da sehe ich gerade das ich alles in den threads bei create erstelle....
da muss ich das mal ummodeln.....
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 14:21
Jep, der Constructor ist außerhalb des Threads, der Destructor innerhalb
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#9

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 14:23
hmmm das stellt mich jetzt aber vor einem problem.

In der Create des Threads habe ich meine objekte die ich brauche angelegt. (Timer, weiter Thread objekte, server socket etc)
Anschließend wenn ich den Thread in der main erstellt habe, muss ich auf variabeln zugreifen die in der create erstellt wurden..... da jetzt aber alles in der execute erstellt wird, wie soll ich das dann lösen.....

Delphi-Quellcode:
  //alles wird in TThreadServer.Create erstellt
  fServer := TThreadServer.Create('log.text');
  fServer.OnProcCommand := OnGetDataFromAgent; //<- wie soll ich das dann machen
  fServer.OnClientConnect := OnClientConnect;
  fServer.OnClientDisconnect := OnClientDisconnect;
  fServer.GoOnline(12345);
  fServer.Resume;
einer eine idee
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#10

Re: warten bis Thread keine Jobs mehr hat.....

  Alt 30. Okt 2008, 14:41
ok habe es jetzt mit einer methode gemacht. Diese wird vom Server aufgerufen wenn alles erstellt wurde.....

hmmm auf einmal läuft alles schneller und ohne fehler.......

vielen dank!!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:35 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