Laden...

trotz Threading keine Performance?!

Erstellt von Taxi4110 vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.147 Views
T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren
trotz Threading keine Performance?!

folgendes: ich hatte ein problem in meiner anwendung. in einem timer-tick event wurde ein array gefüllt und dannach die listview upgedated. sobald der tickevent ausgelöst wurde, ist meine anwendung ca. 1 sek eingefroren. dies wollte ich umgehen, indem ich diese aktualisierung der listbox und das holen des arrays in einen eingenen thread ausgelagert habe.


//thread-timer wird beim aufruf der tabpage geladen

if (tabControl1.SelectedTab == this.tabPage2)
            {
                t_timer = new System.Threading.Timer(new TimerCallback(this.tstart_ignition),null, 100, 3000);
...

die funktion tstart_ignition schaut folgendermaßen aus:


private void tstart_ignition(object o)
        {
            listview.BeginInvoke(new dzuuii(this.trun_ignition),null);
        }
//das delegate dzuuii hab ich am anfang meiner source einfach mit public delegate void dzuuii(); instanziert.

so, die funktion trun_ignition füllt mir ein array und aktualisiert mein listview auf der form.


private void trun_ignition()
        {
            int actual1 = 0;
            int alength = listView1.Items.Count;
            allIntVer = dls.getresult(ipadress, port, password, alength);
                        ....
                        //hier holt er zwei arrays und updated die listview. hab jetzt nicht alles gepostet.

so, leider hat sich an meinem problem nichts geändert. sobald das tickevent aufgerufen wird friert meine anwendung wieder ca. 1sek ein. habe ich da jetzt was falsch verstanden? helft mir bitte ein bisschen auf die sprünge...

P
939 Beiträge seit 2003
vor 18 Jahren

Wie äussert sich das Einfrieren? Keine Reaktion auf Tastendrücke oder nur träge?

die Anwendung wird mit Threads ja nicht schneller, eher langsamer mit den heutigen Single-Core Prozessoren. Das sollte aber nicht viel ausmachen. Trotzdem, falls du gehofft hast, dass durch Threads die Anzeige schneller aktualisieren wird, das wird nichts werden.

Ansonsten sieht der Code eigentlich ganz ok aus. BeginInvoke verhindert einen Blockieren des Threads. Die Anzeige-Aktualisierung wird in die Windows-Botschaften-Warteschlange gestellt und irgendwann ausgeführt. Der BeginInvoke-Aufruf kehrt sofort zurück, der Thread wartet nicht bis die Anzeige aktualisiert wurde.

Probier es nochmal mit Invoke, statt BeginInvoke. Dann wird der Thread zwar blockiert, aber die Anzeige aktualisiert vielleicht schneller.

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Taxi4110,

also für mich sieht das so aus, als ob du in dem gerade gestarteten Thread als erstes ein BeginInvoke ausführtst und damit wird die gesamte Abarbeitung doch wieder in den GUI Thread verlagert. Du solltest nur die eigentlichen und einzelnen Zugriffe auf die Controls per BeginInvoke ausführen.

Wenn die Zugriffe auf die Control selbst das sind, was die Zeit kostet, musst du deine Daten nicht aus den Control holen, sondern eigene Objekte schaffen, die die Daten enthalten. Die Controls sind dann nur noch dafür da, die Daten anzuzeigen. Die Zugriffe erfolgen aber auf die Objekte und auf die kann man auch ohne BeginInvoke von dem zweiten Thread zugreifen.

herbivore

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

ich hab jetzt mein programm durch einen profiler gejagt.


private void trun_ignition()
        {
            int actual1 = 0;
            int alength = listView1.Items.Count;
            allIntVer = dls.getresult(ipadress, port, password, alength); //*HIER

diese array-füllung, die ich markiert habe, braucht für jeden timertick durchlauf 2,39 sekunden. für diese zeit ist meine anwendung eingefroren.

ich möchte ja nicht, dass meine listview sich schneller aktualisiert, sondern das sie in diesen 2,39 sekunden weiter bedienbar bleibt. beispiel: klicke ich mit der rechten taste auf mein listview control, dann muss ich warten, bis diese 2 sekunden verstrichen sind. erst dann macht er mir ein kontext menü auf.
es muss doch eine möglichkeit geben, dieses 'füllen des arrays' in den hintergrund zu verlagen? ?(
dieses array holt mir statistische daten, die dann in der listview angezeigt haben. ich muss diese weder weitervearbeiten noch sind diese zwingend wichtig für den weitern programmablauf.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Taxi4110,

es geht so, wie ich beschrieben habe.

herbivore

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

@herbivore

*bling* bling ...du hattest recht! danke vielmals! 😁

//EDIT: super, bin von einer cpulast von 33% runter auf max. 4%. jetzt rennt das teil wie hölle. danke und bussi an alle 👅