Laden...

Thread bremst System aus.

Erstellt von -Hades- vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.067 Views
-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren
Thread bremst System aus.

Hallo,

ich habe eine kleine Anwendung geschrieben und erzeuge innerhalb des Prozesses 3 Threads. Ein Thread updated eigentlich immer nur eine Form und aktualisiert Textboxen. Das aktualisieren wird durch einen Timer alle 1000ms ausgeführt. Der zweite Thread benutzt die GDI methode getpixel und überprüft für mich einen Bereich auf dem Screen um mich zu informieren ob eine bestimmte Aktion abgeschlossen ist. Ein dritter Thread führt hauptsächlich String methoden aus, also es werden Strings zusammengebaut und deren Inahlt wird durchsucht.
Das Problem was ich jetzt habe ist, dass mein gesamtes System total ausgebremst wird von den drei Threads und ich weiß nicht genau warum. Also wenn ich z.B. auf der Form arbeiten möchte oder sie einfach nur verziehen möchte, dann geht das ganze nur mit sehr viel Verzögerung. Außerdem liefern einige Methoden ab und zu völligen Quatsch zurück. Wenn ich sie einzeln aufrufe bei demselben Szenario liefern sie das gewünschte. Ich habe sowieso bemerkt, dass je mehr Threads ich starte und je latenter das System reagiert, desto mehr Fehler bekomme ich.

Vielleicht kann mir ja jemand ein paar Tipps geben woran so etwas liegen könnte, ich habe mir schon einiges zu Threads durchgelesen und z.B. sichergestellt das kritische Pfade durch ein lock abgesichert werden. Dennoch verstehe ich die hohe Systemauslastung und die sehr unverständlichen Fehler nicht.

Gruß Hades

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo -Hades-,

Der zweite Thread benutzt die GDI methode getpixel und überprüft für mich einen Bereich auf dem Screen um mich zu informieren ob eine bestimmte Aktion abgeschlossen ist.

klingt nach Polling. Und klar, wenn du in einem Thread ungebremst Aktionen ausführst, dann bremst das natürlich das System. Deshalb sollte man Polling nach Möglichkeit auch verneiden.

Außerdem liefern einige Methoden ab und zu völligen Quatsch zurück. Wenn ich sie einzeln aufrufe bei demselben Szenario liefern sie das gewünschte

Klingt nach fehlender Synchronisation. Lock sollte das in der Tat lösen, ob du es nun verstehst oder nicht. 😃

herbivore

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Hallo Herbivore,

schonmal danke für deine Antwort. Dann habe ich das mit den Threads doch wohl noch nicht so ganz verstanden. Es stimmt, dass meine Threads an sich immer durchrattern aber ich dachte das das BS den Threads die zeitscheibe so oft entzieht das alles einigermaßen normal weitergehen kann. Dem ist ja anscheinend nicht so. Wie könnte ich denn meine Threads mal etwas ausbremsen. Einfach an allen Ecken und Enden sleeps einzubauen und damit meine Threads einfach nur latenter machen kann es doch auch nicht sein. Gibt es da sonst noch Möglichkeiten oder muss ich meinen ganzen Code noch einmal durchgehen und genau gucken wann welcher Thread schlafen kann und somit vermeiden das sie immer alle einfach laufen.
Wenn sich das ganze so verhält kann ich ja eigentlich nie auch nur einen Thread permanent arbeiten lassen...?
Mit der Synchronisation muss ich dann nochmal schauen, obwohl ich an sich sichergestellt habe das keine Methode mit falschen oder noch nicht ganz vollständigen Daten aus anderen Threads weiterarbeitet. Es ist wie gesagt etwas verwirrend im Moment.

Ich bin für jeden weiteren Hinweis dankbar.

Gruß Hades

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo -Hades-,

Gibt es da sonst noch Möglichkeiten

wenn du eine Prüfung periodisch durchführen willst, nimm nicht einen Thread mit einer Schleife, sondern einen Timer.

herbivore

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 15 Jahren

Hallo,

ich hätte noch eine Frage, und zwar möchte ich ja das Polling verhindern. Ich habe mir überlegt das ich meine grafischen Threads nur dann starten muss wenn mein Zielfenster aktualisiert wurde. Gibt es eine Möglichkeit auf eine paint-message vom Betriebssystem zu warten und dann erst den Thread zu starten? Also ich habe mal mit dem spy++ geschaut und das Fenster liefert tatsächlich eine paint-meldung. Ich müsste jetzt eine Funktionalität haben, welche schläft und von außen geweckt wird sobald die paint-meldung kommt und somit das System nicht ausbremst.
Vielleicht hat da ja jemand eine Idee.

Gruß Hades

3.971 Beiträge seit 2006
vor 15 Jahren

Du könntest das Event Paint deines entsprechenden Control abonnieren und anschließend deinen Timer oder was auch sonst anwerfen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo -Hades-,

Gibt es eine Möglichkeit auf eine paint-message vom Betriebssystem zu warten und dann erst den Thread zu starten?

wie kleines_eichhoernchen schon sagt, musst du gar nicht warten, sondern der Paint-Event ist, was du haben möchtest. Dahin kannst du den Thread starten.

herbivore

3.971 Beiträge seit 2006
vor 15 Jahren

Noch vllt. als Hinweis,
verwende nicht bei sowas nicht einen selbsterstellten Thread und starte ihn. Das Erstellen bzw. Starten eines Threads ist teuer und kann bei mehrmaligen Ausführen (Painten deines Controls) schnell die Performance in den Keller befördern. Verwende lieber ThreadPool.QueueUserWorkItem oder wenn du auf das Ende des Mal-Vorgangs warten musst einen entsprechenden Delegaten und BeginInvoke sowie EndInvoke.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...