GUI friert ein

Alles rund um die Programmierung mit Qt
Antworten
bender24
Beiträge: 12
Registriert: 16. April 2010 08:39

GUI friert ein

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
bender24
Beiträge: 12
Registriert: 16. April 2010 08:39

Beitrag 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...
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
bender24
Beiträge: 12
Registriert: 16. April 2010 08:39

Beitrag 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?
bender24
Beiträge: 12
Registriert: 16. April 2010 08:39

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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").
bender24
Beiträge: 12
Registriert: 16. April 2010 08:39

Beitrag 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
Antworten