solarix hat geschrieben:Hi! Schlechtes Design, schlechte Idee...
-_-"
solarix hat geschrieben:0. processEvents() aus dem Kontext des Threads aufzurufen bedeutet, dass auch die resultierenden GUI-Updates in diesem Kontext ausgeführt werden. Und das ist verboten/nicht möglich.
OK :/
solarix hat geschrieben:1. Die meisten Qt-Methoden sind reentrant, aber nicht threadsafe. Lies das nach (google), wenn du da nicht sattelfest bist.
Sowas hab ich auch nachgelesen, deshalb hab ich den Mutex drin, oder was meinst du?
solarix hat geschrieben:2. Entkopple den Thread soweit wie möglich von anderen Instanzen wie z.B. der GUI. Ein (queued-)Signal ist besser geeignet, als eine Methode (Static oder mit zyklischen Abhängigkeiten) aufzurufen.
Welchen Thread? Ich hab nur das QtConcurrent::run das mir Threads macht, und ich weiß nicht, inwiefern ich das weiter entkoppeln soll...
solarix hat geschrieben:3. Für Log-Funktionen wird häufig das Singleton-Pattern (zentrale "Registrierstelle") für Log-Meldungen eingesetzt.. google danach, falls du das nicht kennst..
Darüber bin ich in der Tat schonmal gestolpert, aber ich wollte keine große Sache draus machen mit eigener Klasse und Gedönz. Die Funktion die ich gepostet hab hab ich einfach als MessageHandler registriert, darüber bin ich beim Informieren auch gestolpert und es macht genau was ich will: Ohne große Bekanntmachungen kann ich so von Überall aus einfach Warnings und Fehlermeldungen werfen und der Message Handler schnappt die sich einfach und unkompliziert, und ich hab ein Errorlevel gratis dazu, was ich auch brauche, also wenn alles nur Sequentiell wäre wärs echt perfekt...
solarix hat geschrieben:Eine relativ einfache Lösung bei dir wäre z.B., ein Slot des Models mit einem Signal des Threads zu verbinden (connect() in der Kontroller-Klasse welche beide Instazen kennt, z.B. GUI). Damit wäre das Problem entkoppelt, beide Instanzen kennen sich nicht und durch die Qt::QueuedConnection stimmt auch der Threadkontext, wenn das Model die Daten erhält und die Signals (layoutChanged() usw.) feuert...
Wie gesagt, dank QtConcurrent::run weiß ich nicht, wie ich an den Thread irgendwelche Slots connecten soll, und da der Thread gerne mal ne Million mal generiert wird weiß ich nicht, ob das nicht noch mehr overhead fabriziert.
Außerdem will ich den Fehleroutput des gesamten Programms sammeln und wollte eigentlich vermeiden eine extra Klasse zu machen die ich überall hin connecten oder überall bekannt machen muss.
Danke für die schnelle Hilfe. Wenn du irgendwas weißt wie ichs doch noch mit nem MessageHandler hinkrieg wär das super, ansonsten wärs auch ok wenn man irgendwie in ner funktion rausfinden könnte, ob die jetzt sequenziell oder parallel ausgeführt wird, damit ich halt nur bei sequenziell Output in Echtzeit hab. Bevor ich mich noch mit Singletons rumärger lass ichs lieber wies ist und mach das processEvents einfach komplett raus.