Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi JvProgressbar.Marquee aus Thread ändern - Fehler (https://www.delphipraxis.net/109380-jvprogressbar-marquee-aus-thread-aendern-fehler.html)

fnhofm 29. Feb 2008 08:23


JvProgressbar.Marquee aus Thread ändern - Fehler
 
Liste der Anhänge anzeigen (Anzahl: 2)
Guten Morgen,

ich benutze den TJvProgressBar der Jedi’s (JVCL Version 3.33) mit der Eigenschaft Marquee auf true. Dann starte ich einen Thread in dem ich ein Event OnProgress auslöse. In diesem Event möchte ich die Eigenschaft Marquee auf false setzen und „normalen“ Fortschritt im ProgressBar anzeigen. Jedoch wird folgender Fehler ausgelöst:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt threadtest.exe ist eine Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 5.
Zugriff verweigert' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Dies geschieht nur wenn ich die Eigenschaft Marquee verändern möchte. Es stellt kein Problem dar wenn ich z.B. Marquee von Anfang an auf false stelle und nur die Position verändere.
Ich kann den Fehler leider nicht richtig debuggen, da ich in der Jedi Unit JvProgressBar in der Methode SetMarquee keinen Haltepunkt setzen kann (Haltepunkt kriegt weißes X).

Ich habe zwei kleine Units (Formular und Thread) angehängt.

Kann das damit zusammenhängen das ich in der Jedi Unit keinen Haltepunkt setzen kann?
Was ist denn an der Eigenschaft Marquee so besonderes?

Bin für jede Hilfe dankbar.

Freundliche Grüße

Florian

Union 29. Feb 2008 09:14

Re: JvProgressbar.Marquee aus Thread ändern - Fehler
 
Die Lösung steht schon im vom Thread-Wizard eingefügten RIESIGEN Kommentar:
Delphi-Quellcode:
{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
  nur in einer Methode namens Synchronize aufgerufen werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption könnte folgendermaßen aussehen:

    procedure TMyTest.UpdateCaption;
    begin
      Form1.Caption := 'Aktualisiert in einem Thread';
    end; }
Das heißt, Du musst eine Routine im Thread anlegen, die mit Synchronize die OnProgress Methode aufruft.

Falsch (in einem Thread):
Delphi-Quellcode:
procedure TMyTest.Progress(const AProgress: Integer);
begin
  if Assigned(FOnProgress) then
    FOnProgress(AProgress);
end;
So sollte es gehen
Delphi-Quellcode:
private
   FProgress : integer; // Zur Zwischenspeicherung von AProgress
procedure TMyTest.DoOnProgress;
begin
   FOnProgress(FProgress);
end;

procedure TMyTest.Progress(const AProgress: Integer);
begin
  if Assigned(FOnProgress) then
  begin
    FProgress := AProgress;
    Synchronize(DoOnProgress);
  end;
end;

fnhofm 29. Feb 2008 09:26

Re: JvProgressbar.Marquee aus Thread ändern - Fehler
 
Vielen, vielen Dank Union.

Funktioniert wunderbar.
Ich war nur verwirrt weil das Ändern z.B. der Position des Progressbar auch ohne Synchronize funktioniert.
Aber mit dieser Lösung kann ich leben.

Schönes Wochenende.

Union 29. Feb 2008 09:32

Re: JvProgressbar.Marquee aus Thread ändern - Fehler
 
Zitat:

Ich war nur verwirrt weil das Ändern z.B. der Position des Progressbar auch ohne Synchronize funktioniert
Das war wohl eher Zufall, weil die durch die Positionsänderung ausgelösten Zeichenoperationen schneller laufen als ein kompletter Neuaufbau. Die meisten auf VCL basierenden Komponente sind nicht Threadsicher. Als Faustregel gilt: Alles was auf einen Canvas zugreift muss synchronisiert (also im Hauptthread ausgeführt) werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 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