Använda sig av Signals & Slots VS Deklarera pekare i konstruktör - QT C++

Permalänk

Använda sig av Signals & Slots VS Deklarera pekare i konstruktör - QT C++

Jag har en nyfiken fråga.

Normalt i både C och C++ som jag brukar köra rätt ofta för hårdvara och skrivbordsapplikationer som behöver kraft. Då brukar jag använda pekare för att skicka en struktur eller klass till en konstruktör eller funktion för att bygga min "Dependency Injection" vid start av programmet.

Men i QT så finns det något som heter Signals & Slots. För att beskriva vad det är så är det helt enkelt att man kan koppla ihop två objekt och få dom tala med varandra.

Exempel:

LoggingThread::LoggingThread(Database *database, USB *usb) : database(database), usb(usb) { } void LoggingThread::run(){ runThreadProcess = true; int sampleTime = usb->getSampleTime(); while(runThreadProcess){ /* Send data */ qDebug() << "hello"; msleep(sampleTime); } } void LoggingThread::stopSampling(){ runThreadProcess = false; }

Denna kod ovan är en tråd. För att aktivera tråden så måste jag skriva

loggingThread->start()

.
Då körs

void LoggingThread::run()

Men vill jag stoppa den så kan jag faktiskt anropa

void LoggingThread::stopSampling()

igenom en signal.

Då kan jag skicka signalen igenom att skriva detta.

connect(this, &MainWindow::stopSampling, loggingThread, &LoggingThread::stopSampling); emit stopSampling(); disconnect(this, &MainWindow::stopSampling, loggingThread, &LoggingThread::stopSampling);

Då skickar jag en signal från

this

igenom pekarfunktionen

&MainWindow::stopSampling

till objektet

loggingThread

till dess pekarfunktion

&LoggingThread::stopSampling

. I detta fall är

this

faktiskt objektet av

MainWindow

Alltså jag kopplar ihop

this

och

loggingThread

Då är min fråga: Är det alltid bättre att använda Signals & Slots istället för att deklarera pekarobjekt i konstruktören hos C++?
Jag finner Signal & Slots väldigt bra faktiskt. Orsaken varför jag finner Signal & Slots har med att det objekt jag skapar, kan jag återanvända för att skicka andra typer av signaler till ett annat godtyckligt objekt.

Jag kan ju använda pekarobjekt i konstruktören för att förmedla information mellan olika objekt. Men vad är bäst när man kör QT?

Permalänk
Hedersmedlem

@heretic16 ”Alltid bättre” är ju ganska starkt (och säkert inte sant), men signal/slot-systemet är ju väldigt smidigt och flexibelt. Man behöver till exempel inte koppla bort objekt innan man raderar dem, kan koppla även om antalet parametrar inte stämmer och kan dessutom koppla signaler till andra signaler. Baksidan är att allt detta kräver en del administration, så direkta funktionsanrop är snabbare (fast om man inte har väldigt speciella tillämpningar är det nog ingen kritisk nackdel).

Signal/slot-koppling sköter ju också till exempel hanteringen som krävs för att modifiera gui-objekt från bakgrundstrådar.

Permalänk
Skrivet av Elgot:

@heretic16 ”Alltid bättre” är ju ganska starkt (och säkert inte sant), men signal/slot-systemet är ju väldigt smidigt och flexibelt. Man behöver till exempel inte koppla bort objekt innan man raderar dem, kan koppla även om antalet parametrar inte stämmer och kan dessutom koppla signaler till andra signaler. Baksidan är att allt detta kräver en del administration, så direkta funktionsanrop är snabbare (fast om man inte har väldigt speciella tillämpningar är det nog ingen kritisk nackdel).

Signal/slot-koppling sköter ju också till exempel hanteringen som krävs för att modifiera gui-objekt från bakgrundstrådar.

Ja, i detta fall funderar jag på att använda trådar. Så kanske singlas & slots kanske är bra här då.
Jag känner bara till att QT har signals & slots. Inte Visual Studio .NET eller annat programmeringsspråk.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Ja, i detta fall funderar jag på att använda trådar. Så kanske singlas & slots kanske är bra här då.
Jag känner bara till att QT har signals & slots. Inte Visual Studio .NET eller annat programmeringsspråk.

Kör på det! Om du inte redan har gjort det kan det också vara värt att titta på QtConcurrent för bakgrundsaktiviteter. Ofta kan man spara en hel del kodskrivande med till exempel QtConcurrent::run + en lambdafunktion.