Seite 1 von 1

GUI friert ein

Verfasst: 1. Juli 2010 08:35
von bender24
Moin,

ich habe eine kleine Anwendung geschrieben, bei welcher in einem Nebenthread Daten in einen Ringbuffer geschrieben werden, welcher von der GUI, also dem Mainthread, ausgelesen werden. Im Prinzip läuft das auch alles und die Anzeige der Daten aktuallisiert sich auch jede Sekunde (wie von mir gewünscht). Ich bekomme alle 2ms einen neuen Satz Daten und lasse mir diese immer gemittelt über 500 Werte anzeigen.

Nun zum Problem: Hin und wieder kommmt es vor, dass mir die gesamte GUI einfriert. Wenn ich dann den Mauszeiger bewege, rast die GUI durch die Datensätze und holt quasi seinen Rückstand auf den Nebenthread auf, bis der Ringbuffer wieder leer ist.

Was könnte die Ursache dafür sein? Ich würde mal Windows 7 als Übeltäter vermuten. Vielleicht würde es ja reichen, wenn ich die Priorität des Programms hochschraube, aber wie mache ich das, außer mit dem Taskmanager?

Viele Grüße

Verfasst: 1. Juli 2010 09:13
von upsala
Wie teilst du dem Haupt-Thread mit, daß neue Daten da sind. Könnte es da ein Locking-Problem geben, bzw. beim rüberholen in den Haupt-Thread ein Lockingproblem?

Verfasst: 1. Juli 2010 09:43
von bender24
Der mainthread liest die Daten aus dem Ringbuffer (Klasse) aus, wenn er eine 0 zurück bekommt hat er Daten erhalten und wenn er eine 1 zurück bekommt dann halt nicht.

Der Nebenthread schreibt auch in einen anderen Speicherbereich als der Mainthread ausliest. Eine Kollision ist hier nicht möglich!

Das funktioniert auch alles solange ich immer die Maus bewege. Wenn ich die Maus nicht bewege friert die GUI MANCHMAL ein. Und wenn ich sie dann bewege holt der Mainthread den Rückstand auf, da dieser schneller Daten abholen und verarbeiten kann, als diese in den RingBuffer geschrieben werden...

Verfasst: 1. Juli 2010 11:40
von RHBaum
Wenn ich die Maus nicht bewege friert die GUI MANCHMAL ein. Und wenn ich sie dann bewege holt der Mainthread den Rückstand auf, da dieser schneller Daten abholen und verarbeiten kann, als diese in den RingBuffer geschrieben werden...
Also einfrieren der GUI bedeutet bei dir, das die Aenderung der Daten einfach nicht mehr angezeigt wird ...
Sobald aber die mouse bewegt wird, bzw me Taste gedrueckt wird, tut sich wieder was ?
(das ist ned wirklich einfrieren ^^)
Der mainthread liest die Daten aus dem Ringbuffer (Klasse) aus,
Durch was wird dieser Auslesevorgang getriggert ?
ne endlosschleife kann das ja ned sein, dann wuerde deine GUI wirklich einfrieren (keine userevents mehr möglich)
wie kommt er aus der eventloop raus ?

benutzt du timer ?

Ciao ...

Verfasst: 1. Juli 2010 12:18
von bender24
ja, genau. ich benutze einen timer, der jede ms auslöst...

ah, also wird der timer dann nicht mehr ausgelöst?

wie stelle ich ein, dass das stabil läuft?

kann ich die priorität des Programms im quellcode festlegen?

Verfasst: 9. Juli 2010 10:36
von bender24
Also wenn ich mit dem Task-Manager die Priorität des Programms hochsetze kommen diese Unterbrechungen nicht. Zu dem meine ich auch, dass das Problem nur auftritt, wenn ich das Prgramm aus dem Creator heraus aufrufe.

Dennoch würde ich gerne wissen, wie man die Prorität bereits im Quellcode hochsetzen kann. Hat da einer vielleicht doch eine Idee von euch?

grüße

Verfasst: 9. Juli 2010 13:28
von franzf
Bevor hier solche Hacks versucht werden, solltest du mal Code posten, und zwar vollständigen, kompilierbaren Beispielcode. Minimal (auf dein Problem beschränkt), incl. Fehlverhalten. Ich bin mir fast sicher, dass es NUR an deinem Code liegt.
Am besten in ein .zip packen (ohne binaries, dlls, nur source + .pro (make clean vorher machen, bitte)) und hier als Anhang posten (Forumfunktion "Attachments").

Verfasst: 13. Juli 2010 12:57
von bender24
Ich hätte nicht gedacht, dass das so ein großer Hack ist. Aber die Prioritätenvertreilung bei Windows ist bestimmt nicht so leicht...

Ich habe jetzt das ganze Wochenende mit der release Version gearbeitet und da sind keine Fehler aufgetreten, bzw. blieb die Gui nicht stehen. Also wird es wohl daran gelegen haben, dass ich das Programm aus der Entwicklungsumgebung heraus gestartet habe.

Ich danke euch auf jeden Fall für die Mühen und für eure Antworten!!!

Viele Grüße