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
GUI friert ein
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...
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...
Also einfrieren der GUI bedeutet bei dir, das die Aenderung der Daten einfach nicht mehr angezeigt wird ...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...
Sobald aber die mouse bewegt wird, bzw me Taste gedrueckt wird, tut sich wieder was ?
(das ist ned wirklich einfrieren ^^)
Durch was wird dieser Auslesevorgang getriggert ?Der mainthread liest die Daten aus dem Ringbuffer (Klasse) aus,
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 ...
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
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
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").
Am besten in ein .zip packen (ohne binaries, dlls, nur source + .pro (make clean vorher machen, bitte)) und hier als Anhang posten (Forumfunktion "Attachments").
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
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