<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BCB 6 und ProgressBars unter Vista]]></title><description><![CDATA[<p>Ich habe in meinem Programm eine ProgressBar, die beim Transfer einer Datei den Fortschritt anzeigt. Aktualisiere ich unter Vista die ProgressBar oft (also alle ca. 32768 bytes) so flimmert sie nur noch zeigt aber die Position pixelgenau an. Die von links nach rechts laufende Animation wird dann überhaupt nicht &quot;abgespielt&quot;. Ändere ich die Position des Fortschrittsbalkens nur alle paar Pixel so wird zwar die Animation abgespielt es flickert aber trotzdem ab und zu...</p>
<p>Hat jemand irgend ne Ahnung warum das flickert?</p>
<p>Eine Vermutung von mir wäre, dass ich den Dateitransfer auf nen anderen Thread legen muss und nicht das GUI mit Application-ProcessMessages() aktualisieren darf. Alledings wäre diese Änderung sehr kompliziert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/178609/bcb-6-und-progressbars-unter-vista</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 10:00:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178609.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Apr 2007 16:20:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Thu, 12 Apr 2007 16:20:25 GMT]]></title><description><![CDATA[<p>Ich habe in meinem Programm eine ProgressBar, die beim Transfer einer Datei den Fortschritt anzeigt. Aktualisiere ich unter Vista die ProgressBar oft (also alle ca. 32768 bytes) so flimmert sie nur noch zeigt aber die Position pixelgenau an. Die von links nach rechts laufende Animation wird dann überhaupt nicht &quot;abgespielt&quot;. Ändere ich die Position des Fortschrittsbalkens nur alle paar Pixel so wird zwar die Animation abgespielt es flickert aber trotzdem ab und zu...</p>
<p>Hat jemand irgend ne Ahnung warum das flickert?</p>
<p>Eine Vermutung von mir wäre, dass ich den Dateitransfer auf nen anderen Thread legen muss und nicht das GUI mit Application-ProcessMessages() aktualisieren darf. Alledings wäre diese Änderung sehr kompliziert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1264812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1264812</guid><dc:creator><![CDATA[Tobias3]]></dc:creator><pubDate>Thu, 12 Apr 2007 16:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Fri, 13 Apr 2007 00:26:14 GMT]]></title><description><![CDATA[<p>Weist du wie das geht, also den Transfer in einen anderen Thread verschieben? Weil meiner Meinung nach ist das am &quot;Saubersten&quot;. Ich stehe vor einem ähnlichen Problem. Bei mir sind die Rechner beide voll ausgelastet während dem Transfer.</p>
<p>Wäre echt nett wenn du mir nenn Tip geben könntest wie ich den Transfer in einen eigenen Thread verlagere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265019</guid><dc:creator><![CDATA[t0b4d]]></dc:creator><pubDate>Fri, 13 Apr 2007 00:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Fri, 13 Apr 2007 10:04:55 GMT]]></title><description><![CDATA[<p>Du musst aus nem Thread (dafür gibt ne Komponente) deine Transfer-Funktion aufrufen...</p>
<p>Da die VCL aber nicht Thread-save ist musst du dann alle VCL aufrufe (d.h. GUI-Veränderungen) durch Syncronize machen. Das geht erstens langsamer, da er auf den Hauptthread warten muss und zweitens ist es ein enormer Aufwand.</p>
<p>Ich würde aber davon abraten Threads für solche sachen zu benutzen, weil trotz der anfänglichen Eleganz Threads durch das Syncronisieren viel komplizierter sind als select und co.<br />
Z.B. Lese ich die Daten in meinem Programm per select non-blocking und schreibe die Dateien über die OVERLAPPED-IO API von Windows, damit habe ich relativ wenig Probleme. Und bevor ich das alles (was funktioniert) wegen so dummen geflacker umprogrammiere Implementiere ich lieber meine eigene ProgressBar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265174</guid><dc:creator><![CDATA[Tobias3]]></dc:creator><pubDate>Fri, 13 Apr 2007 10:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Fri, 13 Apr 2007 10:31:26 GMT]]></title><description><![CDATA[<p>?? Kann ich nicht nachvollziehen.</p>
<p>Das Problem dürfte das massiv übertriebene Updaten der ProgressBar sein. Diese sollte 10 bis __maximal__ 100 Mal aktualiesiert werden. Aber ganz bestimmt nicht 32000 mal...</p>
<p>Du kannst noch versuchen DoúbleBuffered des Forms auf true zu setzen, aber dennoch solltest Du die Updates auf die ProgressBar drastisch reduzieren.</p>
<p>Und natürlich kann es Sinn machen, das Ganze in einen Thread auszulagern, schon alleine, weil der Hauptthread dann losgelöst von der Arbeit ist. Allerdings, wenn Du aus dem Thread heraus die GOI 32000 mal aktualisierst, hat Tobias recht, das ist Unsinn. Aus Threads heraus, sollte nur ein Minimum an GUI-Aktivität ausgeführt werden. Ich würde in diesem Fall auch gar nicht direkt das GUI aus dem Thread heraus aktulisieren, sondern mit PostMessage eine Nachricht senden, die die Aktualisierung des GUI aufruft. Aber auch das auf gar keinen Fall 32000 Mal...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265194</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 13 Apr 2007 10:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Fri, 13 Apr 2007 18:43:45 GMT]]></title><description><![CDATA[<p>Ich hab im ersten Post geschrieben, dass ich die Position des Fortschrittsbalkens nur alle paar Pixel ändere und es trotzdem flackert...</p>
<p>DoubleBuffered bringt auch nichts...</p>
<p>Ich hab mal ne Versuchsreihe gestartet:</p>
<pre><code>void __fastcall TForm1::Button1Click(TObject *Sender)
{
        for(int i=0;i&lt;100;++i)
        {
                Sleep(100);
                ProgressBar1-&gt;Position+=1;
                Application-&gt;ProcessMessages();
        }
}
</code></pre>
<p>flackert und ist ruckelig in Vista</p>
<pre><code>void __fastcall TForm1::Button2Click(TObject *Sender)
{
        for(int i=0;i&lt;100;++i)
        {
                int tt=GetTickCount();
                while(GetTickCount()-tt&lt;100 )
                        Application-&gt;ProcessMessages();
                ProgressBar1-&gt;Position+=1;
        }
}
</code></pre>
<p>flackert stärker, ruckelt aber nicht mehr... braucht aber 100% CPU (bzw. 50% bei DualCore <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
<pre><code>void __fastcall TForm1::Button4Click(TObject *Sender)
{
        Timer1-&gt;Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        ProgressBar1-&gt;Position+=1;        
}
</code></pre>
<p>Flackert auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Dann kann ich das mit dem extra Thread wohl vergessen...</p>
<p>Das es an der GraKa oder so liegt kann ich eigentlich ausschließen, weil alle anderen ProgessBars in anderen Programmen solche Symptome nicht zeigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1265557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1265557</guid><dc:creator><![CDATA[Tobias3]]></dc:creator><pubDate>Fri, 13 Apr 2007 18:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to BCB 6 und ProgressBars unter Vista on Sat, 14 Apr 2007 15:46:41 GMT]]></title><description><![CDATA[<p>So... hab den Bug gefunden... Hier ist er beschrieben: <a href="http://qc.borland.com/wc/qcmain.aspx?d=38178" rel="nofollow">http://qc.borland.com/wc/qcmain.aspx?d=38178</a></p>
<p>Zum beheben des flackerns also einfach in die .h-Datei:</p>
<pre><code>private:	// Anwender-Deklarationen
        Classes::TWndMethod ProgressBar1WndProc;
public:		// Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
        void __fastcall ProgressBar1NewWndProc(Messages::TMessage&amp; msg);
</code></pre>
<p>Und in die Cpp-Datei:</p>
<pre><code>__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        ProgressBar1WndProc=ProgressBar1-&gt;WindowProc;
        ProgressBar1-&gt;WindowProc=Form1-&gt;ProgressBar1NewWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ProgressBar1NewWndProc(Messages::TMessage&amp; msg)
{
        switch(msg.Msg)
        {
        case WM_ERASEBKGND:
                DefaultHandler(&amp;msg);
                return;
        }
        ProgressBar1WndProc(msg);
}
</code></pre>
<p>War wohl doch nicht mein Fehler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1266019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1266019</guid><dc:creator><![CDATA[Tobias3]]></dc:creator><pubDate>Sat, 14 Apr 2007 15:46:41 GMT</pubDate></item></channel></rss>