Seite 1 von 1

Verständnisfrage zu Events

Verfasst: 30. September 2009 09:59
von Tyrdal
In Qt gibt es Signal/Slots und Funktionen wie send/postEvent. Warum gibt es zwei Wege Events zu verbreiten? Wann benutze ich welchen?

Verfasst: 30. September 2009 10:19
von RavenIV
Kurz und knapp:
Events: Qt-Applikation ohne GUI, also QCoreApplication
Signals: Qt-Applikation mit GUI, also QApplication

Der Rest ist sehr gut im Qt-Assistant oder in der online-Hilfe beschrieben.

Verfasst: 30. September 2009 12:30
von Tyrdal
Das versteh ich noch nicht so ganz. Signal/Slot geht doch auch nicht-Gui Applikationen. Genau darum seh ich ja den Unterschied nicht.

Verfasst: 30. September 2009 12:54
von NoRulez
Grob gesagt...

Signals/Slots verwendet man wenn mann beispielsweise von einer Klasse zu einer anderen was schicken/empfangen möchte.
Events schickt und empfängt man unter anderem Applikationsweit. Das heißt ein Widget schickt ein Event weg, alle anderen können auf das Event reagieren.

Bitte korrigiert mich falls ich auch was falsch verstanden habe.

LG NoRulez

Verfasst: 30. September 2009 17:47
von upsala
Signale werden direkt versendet (ist eigentlich nichts anders als ein direkter Funktionsaufruf) => synchron

Events werden immer über eine Event-Routine abgearbeitet => asynchron

Ausnahme: Signal/Slot-Verbindungen über Threads hinweg, aber das gibt es erst seit Qt4...

Verfasst: 30. September 2009 20:38
von Kratzy974
Signal / Slots können sowohl über Threads als auch innerhalb eines Threads beides sein. (Qt::QueuedConnection = Asynchron, Qt::DirectConnection = Synchron)

Verfasst: 1. Oktober 2009 08:55
von RHBaum
@upsala
Events koennen aber auch synchron / asynchron verarbeitet werden, siehe postEvent und notify !

@Tyrdal
Signale und Slots nutzen teilweisse die Mechanismen von events, teilweisse umgehen sie sie, wo es ned gebraucht wird (Synchrone Aufrufe).
Prinzipiell koenntest du alles selber manuell auch ueber Events machen.
Dann brauchst du aber auch fuer synchrone Aufrufe immer eine Eventloop, was ziemlich unpraktisch waer :-)
Vostellen muesstest du dir auch, das es tausende von userdefinierten Signal / SLot verwendungen mit unterschiedlichen Kontext geben. Dafuer muesste es dann ein genersiches QEvent geben, was alle paramater genereisch haendeln kann (schwer zu bedienen) ... oder es muesste tausende von verschiedenen QEvent Variationen geben.
Der Signal / SLot Mechanismus implementiert dir genau diese generizitaet und du brauchst dich um die datenuebertragung ned zu kuemmern.

Siehs einfach als Vereinfachung ... als einheitliche Schnittstelle fuer synchrone und Assynchrone funktionaufrufe.

Bedeutet fuer dich: Nimm Signale / Slots wenn du kannst, Events wenn du musst :-)

Ciao ...

Verfasst: 1. Oktober 2009 13:01
von Tyrdal
Das hat jetzt geholfen, danke.