Wie reagiere ich auf die Benutzerfreundlichkeit der Benutzeroberfläche, wenn die CPU-Auslastung 100% beträgt (hauptsächlich mit C ++ und Qt)?

8

Ich stehe vor einem Problem, bei dem ich meine Benutzeroberfläche (und das gesamte Betriebssystem) in Multithread-Anwendungen nicht ändern muss.

Ich entwickle eine Anwendung (c ++ und Qt-basiert), die viele Video-Frames gleichzeitig von mehreren Streams empfängt und transformiert.

Jeder Stream wird abgerufen, transformiert und in einem separaten Worker-Thread gerendert (mit DirectX). Das bedeutet, dass ich den Standard-GUI-Thread nicht zum Rendern des Frames verwende.

Auf einem leistungsfähigen Computer habe ich kein Problem, da die CPU alle Daten verarbeiten und Zeit für den GUI-Thread zur Verarbeitung von Benutzeranforderungen behalten kann. Aber auf einem alten Computer, es funktioniert nicht, die CPU wird zu 100% verwendet, um meine Daten zu verarbeiten, und UI verzögert sich, es kann 10 Sekunden dauern, bevor ein Knopfklick verarbeitet wird.

Ich möchte meine Benutzeroberfläche ansprechend halten. Tatsächlich möchte ich, dass mein Worker-Thread nur funktioniert, wenn keine anderen Aktionen ausgeführt werden. Ich habe versucht, die Arbeitsthreadpriorität auf niedrig zu ändern, aber es funktioniert nicht. Ich habe auch einen Schlaf (10) im Arbeiter-Thread versucht, aber weil ich viele Threads haben kann, fallen sie nicht gleichzeitig in den Schlaf, also funktioniert es auch nicht.

Was ist der beste Weg, um in diesem Fall eine Benutzeroberfläche responsiv zu halten (was auch immer das Toolkit verwendet)?

    
SaiyanRiku 17.07.2012, 09:58
quelle

1 Antwort

4

kann meine Kommentare nicht zur obigen Liste hinzufügen, daher muss ich hier meine wenigen Cents hinzufügen:

  • Wenn das Betriebssystem reaktionsschneller sein soll, vergewissern Sie sich, dass Sie nicht zu viel RAM verbrauchen und den Prozess in niedrigerer Priorität starten. afaik-Threadprioritäten werden nur berücksichtigt, wenn das Betriebssystem entscheiden muss, welcher Thread aus dem Prozess ausgeführt werden soll Der Prozess funktioniert immer noch auf 100% CPU, wenn andere Prozesse vom System berücksichtigt werden
  • stellen Sie sicher, dass Sie nicht zu viele Threads ausführen, eine gute Lösung ist es, so viele Threads zu erstellen, die 100% CPU verwenden, wie es Kerne gibt, wenn Sie mehr wollen, dann verwenden Sie Multitasking-Techniken

Eine Sache zu überprüfen - wie Sie Video-Display tun? Stellen Sie sicher, dass die Anzeigefrequenz (Daten von Streams) der Aktualisierungsrate der Grafikkarte entspricht? Wenn Sie Daten zur Anzeige haben, benachrichtigen Sie den Haupt-Thread über die Notwendigkeit, den Bildschirm zu aktualisieren (bessere Lösung) oder erzwingen Sie die Rahmenanzeige von jedem Thread (schlechte Lösung)?

    
Piotr Tkaczyk 17.07.2012, 12:38
quelle

Tags und Links