2016-12-23 1 views
-3

Ich habe Probleme beim Erstellen einer effizienten Methode zum Rendern einer Darstellung von Daten auf einem transparenten Overlay. Alles funktioniert, aber es ist nicht glatt genug für den praktischen Gebrauch.Effizientes Setup für das Befüllen/Rendern von Threads

Ich bin im Moment durch eine verknüpfte Liste von Elementen, die kein definitives Ende hat, wie es ständig aktualisiert wird, aber enthält irgendwo von 20k bis 100k einzigartige Objekte. Ich füge Entitäten, die meinen Bedingungen entsprechen, einem std :: vector hinzu. Wenn ich den aktuellen Endpunkt erreiche (der letzte Link verweist zurück auf den Anfang), verwende ich TryEnterCriticalSection und, wenn ich drinnen bin, erstelle eine Kopie meines Vektors, um ihn im Render-Thread zu verwenden. Ich lösche dann den Vektor.

In meinem Render-Thread ich wieder TryEnterCriticalSection und rendern die Entitäten in der Vektorkopie. Wenn ich fertig bin, lasse ich es und den ganzen Anfang.

Mein Problem ist, dass mein Overlay oft flimmert und nicht reibungslos läuft.

Ist das nur eine schreckliche Art und Weise zu tun, was ich versuche zu tun?

+1

Willkommen Überlauf zu stapeln. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+0

Ich bin nicht sicher, ob es dein Problem lösen wird, aber du könntest die Zeit, die du in deinem kritischen Bereich verbringst, erheblich reduzieren, indem du statt zwei Kopien eine std :: swap() auf zwei Vektoren ausführst. (std :: swap() tauscht einfach zwei interne Zeiger aus anstatt eine O (N) Kopie aller Daten im Vektor zu machen) –

Antwort

0

Sie schreiben, dass Ihre Liste ständig aktualisiert wird. Wenn es von einem anderen Thread aktualisiert wird, muss die Liste mit Mutex oder mit kritischem Abschnitt geschützt werden. Andernfalls könnte der Lese-Thread Daten verlieren oder eine Ausnahme auslösen. Zum Beispiel: erstellen globales Objekt
mutex m;

Bei der Aktualisierung thread:

m.lock(); 
UpdateList(); 
m.unlock(); 

Beim Lesen thread:

m.lock(); 
// loop through list, create vector 
// enter critical section, update vector for render thread, leave critical section 
m.unlock(); 
Verwandte Themen