Einzelnen Beitrag anzeigen

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, 19: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