In Qt, wenn ein Signal von einem temporären Objekt aufgerufen wird, so dass das Objekt gelöscht werden kann, wenn der Slot aufgerufen wird, ist es ein Fehler?Qt-Signale/Slots: Ist es ein Fehler, ein Signal von einem temporären Objekt zu senden?
Falls relevant, gibt der Code das Signal vom Konstruktor des temporären Objekts aus.
(Anmerkung: Da es keine Zeiger oder Referenzen gibt, die als Argument übergeben werden, handelt es sich also nicht um Fragezeichen oder Referenzen. Ich möchte nur wissen, ob es in seiner einfachsten Form akzeptabel ist, ein Signal zu senden . von einem temporären Objekt in Qt)
Hier ist eine verkürzte Version von meinem Code:
// My application
class HandyApplication: public QApplication
{
Q_OBJECT
public:
explicit HandyApplication(int argc, char * argv[]);
signals:
public slots:
void handySlot(std::string const msg);
};
// Class that will be instantiated to a temporary object
class Handy: public QObject
{
Q_OBJECT
public:
Handy()
{
QObject::connect(this, SIGNAL(handySignal(std::string const)),
QCoreApplication::instance(),
SLOT(handySlot(std::string const)));
emit handySignal("My Message");
}
signals:
void handySignal(std::string const msg);
};
// An unrelated function that may be called in another thread
void myFunction()
{
Handy temporaryObject; // This constructor call will emit the signal "handySignal" above
}
Wie Sie das temporäre Objekt sendet das Signal von seinem Konstruktor sehen können, und wird dann sofort zerstört. Daher kann der Steckplatz aufgerufen werden, nachdem das Objekt, das das Signal gesendet hat, zerstört wird.
Ist das sicher, oder ist dies ein potenzielles Problem oder ein Fehler?
Stimmt es nicht, dass der * emit * -Aufruf asynchron ist, wenn das Signal von einem anderen Thread als dem Thread gesendet wird, in dem der Slot aufgerufen wird? –
@DanNissenbaum: Ya das ist, was ich gesagt habe, obwohl. Wenn es sich in einem anderen Thread befindet, wird es zu einer Verbindung in der Warteschlange.Aber selbst wenn das der Fall ist, wenn das Signal keine Objekte ausgibt, die ungültig sein könnten, dann gibt es kein Problem. Der Anruf wird in der Ziel-Thread-Ereignisschleife registriert und unabhängig vom Absender aufgerufen. – jdi
Brauchen Sie * den * Anruf, um synchronisiert oder asynchron zu sein, oder ist Ihnen das egal? Im ersten Fall können Sie auch einfach die Methode aufrufen ('obj-> method (args)'); Im letzteren Fall verwenden Sie 'QMetaObject :: invokeMethod' mit' QueuedConnection', um den Aufruf zu erzwingen, wenn Sie zur Ereignisschleife zurückkehren. – peppe