AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnTimer wird nicht ausgelöst

Ein Thema von Chemiker · begonnen am 27. Apr 2009 · letzter Beitrag vom 29. Apr 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#11

Re: OnTimer wird nicht ausgelöst

  Alt 27. Apr 2009, 22:32
Zitat von bigben37:
delay ist dein Freund. Damit werden andere Prozesse weiterhin verarbeitet.
Das Sleep in meiner Anwendung war ja nur ein Beispiel. *g* Chemiker macht in dieser Zeit ja eine Datenbank-Abfrage, welche die entsprechende Zeit die mein sleep() verschlafen hat, mit suchen in der Datenbank verbringt. (Oder mit warten auf eine Antwort des Datenbank-Servers, das hängt eben von der DB ab)

Mit freundlichen Grüßen,

Valle
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#12

Re: OnTimer wird nicht ausgelöst

  Alt 27. Apr 2009, 22:36
Mist

Aber eigentlich kann das verzögern ja nur von dieser Zeile kommen FAbfrageClass.MSErmitteln;, da die drei anderen Zeilen nur zum einfachen zeichnen oder eine Zuweisung sind. Also müssten wir diese Prozeure mal zu Gesicht bekommen. (Ich hoff, meine Argumetation ist wenigstens halbwegs richtig )
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: OnTimer wird nicht ausgelöst

  Alt 27. Apr 2009, 22:47
Hallo,

Delphi-Quellcode:
procedure TAbtfrageClass.MSErmitteln;
var
  I: integer;
begin
  with FpFIBDataSetAbfrage do
  begin
    Close;
    SelectSQL.Text:= 'SELECT DISTINCT mw_msid FROM mw_tabelle';
    GenerateSQLs;
    Open;
    while not EOF do
    begin
        // Die MSId-Bezeichnung aus der Datenbank wird in einer StringList
        // gespeichert. Diese Bezeichung ist auch gleichzeitig die Spalten-
        // bezeichnung für die PIVOT-Tabelle.
      FMSListe.add(FieldByName('mw_msid').AsString);
      next;
    end;
  end;
end;
das ist die Procedure. Damit werden alle Datensätze durchlaufen und das kostet Zeit. Das ist der Grund warum ein Fenster mit einer Gauge angezeigt werden soll.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#14

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 07:48
Nach "next" ein Application.ProcessMessages. Wobei das nicht bei jedem Schleifendurchlauf aufgerufen werden sollte, sondern nur alle x Durchläufe.

Falls die Variable i in der Schleife hochgezählt wird:
if (i mod 100) = 0 then Application.ProcessMessages Statt einem Timer wäre es in meinen Augen auch elegant, MSErmitteln eine Procedure zu übergeben, die die ProgressBar oder Gauge aktualisiert. Die Procedure statt Application.ProcessMessages aufrufen, was innerhalb der Procedure erledigt würde.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 08:02
Hallo Satty67,

die Schleife wird nur 25 durchlaufen. Das Problem ist der SQL-Aufruf, weil er alle Datensätze durchläuft.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#16

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 11:21
Hallo,

Delphi-Quellcode:
procedure TAbtfrageClass.MSErmitteln;
var
  I: integer;
begin
  i := 0;
  with FpFIBDataSetAbfrage do
  begin
    Close;
    SelectSQL.Text:= 'SELECT DISTINCT mw_msid FROM mw_tabelle';
Application.ProcessMessages;
    GenerateSQLs; // Wie lange braucht der? Wenn lange, dann dahinter ein
Application.ProcessMessages;
    Open; // Solange der ackert, wird's vermutlich nichts mit dem Aktuallisieren der Gauge.
Application.ProcessMessages;
    while not EOF do
    begin
        // Die MSId-Bezeichnung aus der Datenbank wird in einer StringList
        // gespeichert. Diese Bezeichung ist auch gleichzeitig die Spalten-
        // bezeichnung für die PIVOT-Tabelle.
      FMSListe.add(FieldByName('mw_msid').AsString);
      next;
      Inc(i);
      // Zeit- und datenmengenabhängig größeren oder kleineren Wert nehmen.
      If i Mod 100 = 0 then begin
        Application.ProcessMessages;
      end;
    end;
  end;
end;
Wie stehen die Start- und Endewerte für frmWarnhinweis.frmWarnung.Gauge1?
Woher weiß die Routine, wann sie den Endewert erreicht hat um ggfls. wieder von vorne anzufangen. Sind Start- und Endewert eventuell so gewählt, dass ein Progress + 10 eine so kleine Veränderung der Gauge liefert, dass der Fortschritt nur einfach nicht zu sehen ist?

Alternative: Lass den Timer weg und rufe die MethodeTimer1Timer(Sender: TObject); in MSErmitteln auf:
Delphi-Quellcode:
procedure TAbtfrageClass.MSErmitteln;
var
  I: integer;
begin
  i := 0;
  with FpFIBDataSetAbfrage do
  begin
    Close;
    SelectSQL.Text:= 'SELECT DISTINCT mw_msid FROM mw_tabelle';
Application.ProcessMessages;
    GenerateSQLs; // Wie lange braucht der? Wenn lange, dann dahinter ein
Application.ProcessMessages;
    Open;
Application.ProcessMessages;
    while not EOF do
    begin
        // Die MSId-Bezeichnung aus der Datenbank wird in einer StringList
        // gespeichert. Diese Bezeichung ist auch gleichzeitig die Spalten-
        // bezeichnung für die PIVOT-Tabelle.
      FMSListe.add(FieldByName('mw_msid').AsString);
      next;
      Inc(i);
      // Zeit- und datenmengenabhängig größeren oder kleineren Wert nehmen.
      If i Mod 100 = 0 then begin
        Timer1Timer(Nil); // Gaugeposition verändern.
        Application.ProcessMessages;
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 11:43
Lasst doch bitte einmal dieses ständige Application.ProcessMessages! Dafür ist es überhaupt nicht da. Wie weiter oben bereits erwähnt wurde, muss die gesamte Datenbankgeschichte in einen eigenen Thread. Ja, das ist ein wenig aufwendig aber der Anwender deines Programms wird es dir danken.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#18

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 11:49
... vielleicht so?
Delphi-Quellcode:
procedure TAbtfrageClass.MSErmitteln;

  procedure Gauge_refresh(Value: Integer);
  begin
    frmWarnhinweis.frmWarnung.Gauge1.Progress:= frmWarnhinweis.frmWarnung.Gauge1.Progress+ Value;
    frmWarnhinweis.frmWarnung.Refresh;
    Application.ProcessMessages;
  end;
 
begin
  with FpFIBDataSetAbfrage do
  begin
    Close;
    SelectSQL.Text:= 'SELECT DISTINCT mw_msid FROM mw_tabelle';
    Gauge_refresh(10);
    GenerateSQLs; // Wie lange braucht der? Wenn lange, dann dahinter ein
    Gauge_refresh(10);
    Open; // Solange der ackert, wird's vermutlich nichts mit dem Aktuallisieren der Gauge.
    Gauge_refresh(10);
    while not EOF do
    begin
        // Die MSId-Bezeichnung aus der Datenbank wird in einer StringList
        // gespeichert. Diese Bezeichung ist auch gleichzeitig die Spalten-
        // bezeichnung für die PIVOT-Tabelle.
      FMSListe.add(FieldByName('mw_msid').AsString);
      next;
      Gauge_refresh(5); // anpassen je nach Anzahl der Bezeichnungen
      end;
    end;
  end;
end;
[edit] und natürlich muss der Timer weg
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#19

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 12:00
Zitat von sirius:
Lasst doch bitte einmal dieses ständige Application.ProcessMessages! Dafür ist es überhaupt nicht da. Wie weiter oben bereits erwähnt wurde, muss die gesamte Datenbankgeschichte in einen eigenen Thread. Ja, das ist ein wenig aufwendig aber der Anwender deines Programms wird es dir danken.
Kann da nur zustimmen ! Application.ProcessMessages wird ja gerne als Allheilmittel empfohlen. Was fatal ist, wenn man nicht bedenkt, daß die GUI quasi parallel weiterarbeitet, inklusive FormClose, nochmaliger Aufruf einer Funktion über ButtonClicks etc.
Die nächste Frage ist schon vorprogrammiert -> "ich will mein Programm schliessen aber es tut sich nichts"....

Der saubere Weg ist ein Thread, der kontrolliert gestartet und beendet wird.

blauweiss
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#20

Re: OnTimer wird nicht ausgelöst

  Alt 28. Apr 2009, 12:18
Hi,

mal ein anderer Ansatz:

SelectSQL.Text:= 'SELECT mw_msid FROM mw_tabelle group by mw_msid'; Evtl. dann ein "Ich mach was"-Hinweis nicht mehr nötig?
Gruß
Norman
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 14:50 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