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?