Qt Multithreading Verständnisfragen
Verfasst: 23. Juli 2010 18:18
Hallo,
nachdem ich mich mal an Multithreading versucht habe und mein Programm mir immer segmentation faults an den Kopf wirft, habe ich mich mal genauer mit Qt beschäftigt und komme mir eher blöder als vorher vor. Daher frage ich euch mal, ob ich alles richtig verstanden habe:
1. Die Event Loop: Wird aufgerufen über exec(), normalerweise in der run() Funktion. Ohne Event Loop kann ich keine Signale über QueuedConnection empfangen. Wenn ich mehrere Signale als QueuedConnection an eine Event Loop schicke, werden diese sequenziell abgearbeitet?
2. DirectConnection vs. QueuedConnection. Angenommen, ich schicke ein Signal von Thread A an Thread B. Weiterhin angenommen, ich wähle als Signaltyp DirectConnection, dann wird der zu B gehörige Slot unmittelbar in Thread A aufgerufen. Thread B läuft parallel dazu jedoch weiter, weshalb segmentation faults z.B. durch gleichzeitig genutzte Membervariablen entstehen können. Darüber hinaus ist es bei DirectConnections unerheblich ob eine Event Loop existiert oder nicht, da der Slot unabhängig davon aufgerufen wird.
Wenn ich nun eine QueuedConnection verwende, muss nur Thread B eine Event Loop besitzen.
3. Wenn ich den connect Befehl mit QueuedConnections verwende, sind diese der Grund, dass ich qRegisterMetatype verwenden muss. Da ich nicht sicher sein kann, dass der Slot unmittelbar nach dem Senden des Signals ausgeführt wird, müssen die übertragenen Daten irgendwo zwischengespeichert werden. Um Qt mitzuteilen, wie diese "aussehen", verwendet man qRegisterMetatype.
Wie schon gesagt, ein "stimmt" oder "stimmt nicht" ist völlig ausreichend. Falls alles stimmt, bin ich einerseits froh, dass ich es verstanden habe - auf der anderen Seite darf ich aber mein ganzen Programm wieder neu schreiben
Danke,
Thomas[/code]
nachdem ich mich mal an Multithreading versucht habe und mein Programm mir immer segmentation faults an den Kopf wirft, habe ich mich mal genauer mit Qt beschäftigt und komme mir eher blöder als vorher vor. Daher frage ich euch mal, ob ich alles richtig verstanden habe:
1. Die Event Loop: Wird aufgerufen über exec(), normalerweise in der run() Funktion. Ohne Event Loop kann ich keine Signale über QueuedConnection empfangen. Wenn ich mehrere Signale als QueuedConnection an eine Event Loop schicke, werden diese sequenziell abgearbeitet?
2. DirectConnection vs. QueuedConnection. Angenommen, ich schicke ein Signal von Thread A an Thread B. Weiterhin angenommen, ich wähle als Signaltyp DirectConnection, dann wird der zu B gehörige Slot unmittelbar in Thread A aufgerufen. Thread B läuft parallel dazu jedoch weiter, weshalb segmentation faults z.B. durch gleichzeitig genutzte Membervariablen entstehen können. Darüber hinaus ist es bei DirectConnections unerheblich ob eine Event Loop existiert oder nicht, da der Slot unabhängig davon aufgerufen wird.
Wenn ich nun eine QueuedConnection verwende, muss nur Thread B eine Event Loop besitzen.
3. Wenn ich den connect Befehl mit QueuedConnections verwende, sind diese der Grund, dass ich qRegisterMetatype verwenden muss. Da ich nicht sicher sein kann, dass der Slot unmittelbar nach dem Senden des Signals ausgeführt wird, müssen die übertragenen Daten irgendwo zwischengespeichert werden. Um Qt mitzuteilen, wie diese "aussehen", verwendet man qRegisterMetatype.
Wie schon gesagt, ein "stimmt" oder "stimmt nicht" ist völlig ausreichend. Falls alles stimmt, bin ich einerseits froh, dass ich es verstanden habe - auf der anderen Seite darf ich aber mein ganzen Programm wieder neu schreiben
Danke,
Thomas[/code]