AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem mit Thread und ProgressBar

Ein Thema von Helmi · begonnen am 21. Okt 2009 · letzter Beitrag vom 21. Okt 2009
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#11

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 20:17
Zitat von Tryer:
Da ich nichts von {APPTYPE CONSOLE} und WriteLn - Ausgaben sehe: Hast Du den abwechselnden Aufruf beim Debuggen vielleicht mit Haltepunkten hervorgerufen? Vielleicht kommt das Formular dank zahlreicher Sync-Anfragen garnicht zum neuzeichnen. Ob die Position sich überhaupt ändert könnte vermutlich ein nachgeschaltetes ProcessMessages zeigen.
Ich habe schon ProcessMessages eingebaut, als auch mal ein Sleep, weil ich mir das gleiche wie du auch schon dachte
aber es nützt nichts.

Ich sehe aber, dass diese Procedur angesprungen wird, bzw. durchlaufen wird
aber die Progressbar geht nicht.

Ich hab auch mal versucht, ein Label beschreiben zu lassen, aber auch das passiert erst, wenn der Thread zu ende ist

[Edit]

Ich hab jetzt mal einen Test gemacht und hab festgestellt, dass sich da irgendwas "ansammelt". Denn, wenn ich im Thread
nach der try/finally-Block ein Sleep(10000) einsetzt, dann seh ich dass die Progressbar auf einmal aufgebaut wird und
danach erst beendet sich der Thread (nach Ablauf der Sleep-Zeit).

Delphi-Quellcode:
procedure TThreadUnit.Execute;
var
  b_Allgemein: Boolean;
  b_Kanal : Boolean;
  b_Achse : Boolean;
  b_Antrieb : Boolean;
  b_Anzeige : Boolean;

  StringList_NCUpgrade: TStringList;

begin
  inherited;

  //Variablen leeren
  i_Anzahl_Allgemein := 0;
  i_Anzahl_Kanal := 0;
  i_Anzahl_Achse := 0;
  i_Anzahl_Antrieb := 0;
  i_Anzahl_Anzeige := 0;

  //NC-Upgradefile als String holen
  Synchronize(NCUpgrade_holen);

  //Maschinendaten-Auswahl holen
  Synchronize(MDAuswahl_holen);

  //Variablen beschreiben
  b_Allgemein := (i_MDAuswahl and 1) = 1;
  b_Kanal := (i_MDAuswahl and 2) = 2;
  b_Achse := (i_MDAuswahl and 4) = 4;
  b_Antrieb := (i_MDAuswahl and 8) = 8;
  b_Anzeige := (i_MDAuswahl and 16) = 16;

  //StringList erzeugen
  StringList_NCUpgrade := TStringList.Create;

  try
    StringList_NCUpgrade.Text := S_NCUpgrade;

    //wenn die CheckBox "Allgemein" aktiv ist, dann die MD´s "Allgemein" auslesen
    If b_Allgemein then
      begin
        i_Anzahl_Allgemein := Allgemein_Maschinendaten_auslesen(StringList_NCUpgrade);

        Synchronize(MDAuslesen_fertig);
      end;

    //wenn die CheckBox "Kanal" aktiv ist, dann die MD´s "Kanal" auslesen
    If b_Kanal then
      begin
        i_Anzahl_Kanal := Kanal_Maschinendaten_auslesen(StringList_NCUpgrade);

        Synchronize(MDAuslesen_fertig);
      end;

    //wenn die CheckBox "Achs" aktiv ist, dann die MD´s "Achs" auslesen
    If b_Achse then
      begin
        i_Anzahl_Achse := Achs_Maschinendaten_auslesen(StringList_NCUpgrade);

        Synchronize(MDAuslesen_fertig);
      end;

    //wenn die CheckBox "Antrieb" aktiv ist, dann die MD´s "Antrieb" auslesen
    If b_Antrieb then
      begin
        i_Anzahl_Antrieb := Antrieb_Maschinendaten_auslesen(S_NCUpgrade);

        Synchronize(MDAuslesen_fertig);
      end;

    //wenn die CheckBox "Anzeige" aktiv ist, dann die MD´s "Anzeige" auslesen
    If b_Anzeige then
      begin
        i_Anzahl_Anzeige := Anzeige_Maschinendaten_auslesen(StringList_NCUpgrade);

        Synchronize(MDAuslesen_fertig);
      end;
  finally
    //StringList löschen und freigeben
    FreeAndNil(StringList_NCUpgrade);
  end;

  sleep(10000);

  //mit MainForm-Procedure synchronisieren
  Synchronize(fertig);
end;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#12

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 20:54
Hallo Helmi,

ich habe heute schon zu lange vor dem Rechner gesessen, um noch alles durchzulesen.

Mir fällt aber inherited auf. Ich weiß nicht, was der Thread dann alles Ererbtes macht.

Das habe ich so noch nie benutzt und auch noch nie davon gehört. Vielleicht lässt Du das mal weg.

Abgesehen davon musst Du natürlich immer darauf achten, dass niemand Anderes auf denselben Speicher zugreift (es ist keine Synchronisation mit anderen Threads sichtbar)

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:00
Zitat von messie:
Hallo Helmi,

ich habe heute schon zu lange vor dem Rechner gesessen, um noch alles durchzulesen.

Mir fällt aber inherited auf. Ich weiß nicht, was der Thread dann alles Ererbtes macht.

Das habe ich so noch nie benutzt und auch noch nie davon gehört. Vielleicht lässt Du das mal weg.

Abgesehen davon musst Du natürlich immer darauf achten, dass niemand Anderes auf denselben Speicher zugreift (es ist keine Synchronisation mit anderen Threads sichtbar)

Grüße, Messie
Das mit dem inherited wird am Anfang einmal aufgerufen und dann ist gut, spielt also keine Geige
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#14

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:00
Zitat von messie:
ich habe heute schon zu lange vor dem Rechner gesessen, um noch alles durchzulesen.

Mir fällt aber inherited auf. Ich weiß nicht, was der Thread dann alles Ererbtes macht.

Das habe ich so noch nie benutzt und auch noch nie davon gehört. Vielleicht lässt Du das mal weg.

Abgesehen davon musst Du natürlich immer darauf achten, dass niemand Anderes auf denselben Speicher zugreift (es ist keine Synchronisation mit anderen Threads sichtbar)
Ich habe es jetzt mal ohne inherited gemacht, aber das bringt auch nichts.
Es gibt nur einen Thread (jedenfalls von mir erzeugtem Thread) und da ist meines Wissens nach keine Synchronisation mit einem anderen Thread vorhanden
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#15

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:18
Versuch mal
Delphi-Quellcode:
PostMessage(MainForm.Progressbar.Handle, PBM_SETPOS,
  MainForm.Progressbar.Position + 1, 0);
an Stelle des Synchronize - Aufrufs (event. auch noch mit zusätzlichem Sleep(0). Vielleicht wacht der MainThread darüber aus dem Idle / CheckSynchronize auf. Unter D7 / XP kann ich das Problem leider nicht nachvollziehen.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#16

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:23
Konsequenter wäre es, wenn die mit Synchronize aufgerufenen Routinen Teil des Threads wären. Bei Dir sind sie global deklariert und gehören damit eigentlich dem MainThread. Wenn Du dort das Anpassen des Progressbar aufrufst, würde ich ein Application.ProcessMessages nach Aufruf der Routine des MainForm platzieren.

Grüße, Messie
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#17

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:26
Zitat von messie:
Bei Dir sind sie global deklariert und gehören damit eigentlich dem MainThread.
Logisch gesehen sind sie das wenn sie mit Synchronize aufgerufen werden (Direkter Aufruf aus MainThread ok, direkter Aufruf aus Thread: kritisch).
Das ProcessMessages nix bringt hat er doch schon erwähnt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#18

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:32
Die Progressbar läuft jetzt nur einmal durch, bzw. die soll?

Und die PB mal rückwärts laufen zu lassen ändert auch nix an der Darstelung?
PB.Position := PB.Max - i - 1; Wie gesagt, seit Vista hat MS die Darstellung geändert und jetzt läuft sie halt nicht mehr ruckartig

z.B. vom Pos=10 gleich auf Pos=30, sondern sie bewegt sich "langsam" (Pixelweise) auf den neuen/aktuellen Wert zu.
Aber beim einem Rückschritt (Pos wurde kleiner) soll sie sich angeblich sofort/sprungartig auf den neuen Wert bewegen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#19

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:37
Zitat von messie:
Konsequenter wäre es, wenn die mit Synchronize aufgerufenen Routinen Teil des Threads wären. Bei Dir sind sie global deklariert und gehören damit eigentlich dem MainThread. Wenn Du dort das Anpassen des Progressbar aufrufst, würde ich ein Application.ProcessMessages nach Aufruf der Routine des MainForm platzieren.
Daraus werd ich nicht schlau!
Die mit Synchronize aufgerufenen Routinen sind im private-Bereich des Threads deklariert - und so Teil des Threads.
Nur darin werden dann Proceduren der MainForm aufgerufen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Problem mit Thread und ProgressBar

  Alt 21. Okt 2009, 21:59
Hallo,

ich hatte auch ein ähnliches Problem vor kurzem, da hat der Thread erst deutlich nach einer Aktion die Anzeige der geänderten Form aktualisiert. Schau dir das mal an Ich konnte das Problem durch ein Aufrufen der MainForm.Refresh am Ende der Prozeduren, welche in Syncronize aufgerufen werden, lösen. Konnte das leider in deinem Projekt nicht testen, da etliche deiner Uses-Klauseln in meinem TE2006 hier zu Hause nicht akzeptiert werden. Habe einfach mal mit der Suchfunktion deine MainUnit und deine ThreadUnit durchsucht und nichts gefunden in der Art.

Hoffe das hilft dir vieleicht etwas
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:25 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