Seite 1 von 2

[gelöst] Signalbehandlung in C++

Verfasst: 17. August 2006 09:50
von KarlHeinz
Moin Moin,

ich wollte mal wissen ob die Singalbehandlung in C++ bzw. QT genauso zu realisieren ist wie in C?

Code: Alles auswählen

signal(signummer,funktion);

funktion(int){};
Mit freundlichen Grüßen,

KarlHeinz

Verfasst: 17. August 2006 11:01
von FlorianBecker
Also in C++ gibts außer einer Erweiterung mal eh nix. Die Erweiterung, die ich kenne nennt sich sigc++.

Und alle drei unterscheiden sich irgendwie. Nein, es ist nicht so, wie du es als Beispiel genannt hast.

Verfasst: 17. August 2006 11:18
von Mister_Crac
Also ich kenne das aus der Betriebssystem-Vorlesung so:

Code: Alles auswählen

#include <signal.h>

void signal_handler(int signal)
{
	/* Hier steht der Code der Signal Handler-Funktion */
}

int main(int argc, char** argv)
{	
	signal(SIGINT, signal_handler);
	signal(SIGTERM, signal_handler);

	/* Jetzt wird die Funktion signal_handler aufgerufen, wenn
	man kill <PID> an der Konsole eingibt oder aber bei Drücken
	von CTRL-C. */
}
Ist halt reines C, aber ich wüsste jetzt nicht, dass man das in C++ irgendwie anders machen würde. Aber ich weiß ja auch nicht alles ;-)

Verfasst: 17. August 2006 11:21
von FlorianBecker
In C++ nutzt man doch normalerweise keine nativen C Dinge mehr, oder? Und in Qt ja gleich überhaupt niemals nicht.

Verfasst: 17. August 2006 11:29
von Mister_Crac
FlorianBecker hat geschrieben:In C++ nutzt man doch normalerweise keine nativen C Dinge mehr, oder? Und in Qt ja gleich überhaupt niemals nicht.
Ja genau, in C++ benutzt man ja auch keine freien Funktionen mehr, sondern nur noch Methoden von Klassen. :roll: :wink:

Im Ernst, kann gut sein dass es da andere Möglichkeiten gibt - vielleicht erleuchtet uns ein C++-Profi mal darüber :-)

Verfasst: 17. August 2006 11:38
von FlorianBecker
Hehe, ja, genau. Aber es ist wirklich so, dass du in C++ alles ein wenig einfacher hast als in C meiner Meinung nach.

Also in C++ nimmt man sigc++ wenn man Signal / Slot Verwaltung haben will. Es gibt sicherlich weitere Alternativen, aber die sind zumindest mit nicht geläufig bzw. nicht relavant genug.

In Qt nimmt man das Qt eigene System.

connect( OBJECT, SIGNAL, RECEIVER, SLOT )
um es deuthlicher in C++ auszudrücken:
QObject::connect( ... );

Das ganze geht eigentlich über das moc System, was da dann die gesamten Verbindungen herstellt und schlussendlich nix anderes wie sigc++ von Anfang an macht.

Slots werden selbst definiert mit public slots, protected slots oder private slots:
Wenn man eigene Signale haben will, dann definiert man das mit signals

Moc wandelt jede Datei um, die das Q_OBJECT Makro verwendet und verbindet die connect ebenfalls geleich richtig.

Es gibt auch noch AutoSlots, aber das ist für hier wohl zu komplex um es eben mal zu erklären, steht alles in der Dokumentation.

Also dein Beispiel:

class Klasse {

Q_OBJECT

signals:
void mySignal();
public slots:
void funktion();
}

Das kannst du jetzt in einem connect z.B. so nutzen:
connect( this, SIGNAL( mySignal() ), Klasse, SLOT( funktion() ) );

oder wie auch immer, da sind deiner Fantasie eigentlich kaum Grenzen gesetzt. Hab ich etwas wichtiges nicht beantwortet?

Verfasst: 17. August 2006 14:29
von Mister_Crac
Hm, ich dachte jetzt dem Thread-Ersteller ging es mehr um die Signale, die man eben von der Konsole aus (unter Linux) an einen Prozess schicken kann, wie z.B. kill -9 PID, wobei das ist ein schlechtes Beispiel weil es nicht abgefangen werden kann ;-)
Inwieweit man das mit Qt machen kann - keine Planung. Bin noch blutiger Anfänger was Qt betrifft.

Verfasst: 17. August 2006 14:35
von KarlHeinz
Mister_Crac hat geschrieben:Hm, ich dachte jetzt dem Thread-Ersteller ging es mehr um die Signale, die man eben von der Konsole aus (unter Linux) an einen Prozess schicken kann, wie z.B. kill -9 PID, wobei das ist ein schlechtes Beispiel weil es nicht abgefangen werden kann ;-)

Ja genau, um diese Art Signale geht es mir.


Mit freundlichen Grüßen,

KarlHeinz

Verfasst: 17. August 2006 14:35
von Einmaliger
Mister_Crac hat geschrieben:Hm, ich dachte jetzt dem Thread-Ersteller ging es mehr um die Signale, die man eben von der Konsole aus (unter Linux) an einen Prozess schicken kann, wie z.B. kill -9 PID, wobei das ist ein schlechtes Beispiel weil es nicht abgefangen werden kann ;-)
Inwieweit man das mit Qt machen kann - keine Planung. Bin noch blutiger Anfänger was Qt betrifft.
Das sollte natürlich genauso wie in C++ gehen. Musst nur den Header <signal.h> einbinden, und schon hast du auch die entsprechende Funktion signal(). Inwieweit sich das mit Qt verträgt, weiß ich aber nicht. Mein Idee wäre, in der Signalbehandlungsfunktion mittels "emit" ein Qt-Signal zu erzeugen und die eigentliche Behandlung dann in einem Slot vorzunehmen. FlorianBecker hat ja schon kurz beschrieben, was es mit Qt-Signalen auf sich hat.

Verfasst: 17. August 2006 14:54
von KarlHeinz
Danke für die vielen Antworten, zu Einmaliger:

Ich habe die signal.h, die Funktion signal() und eine Funktion zum auffangen des Signals eingebunden, beim kompilieren bekomm ich aber folgenden Fehlermeldung:

Code: Alles auswählen

mainwindow.ui.h:89: error: argument of type `void (mainWindow::)(int)' does not match `void (*)(int)'

Verfasst: 17. August 2006 16:11
von Einmaliger
KarlHeinz hat geschrieben:

Code: Alles auswählen

mainwindow.ui.h:89: error: argument of type `void (mainWindow::)(int)' does not match `void (*)(int)'
Was steht denn in Zeile 89?

Verfasst: 18. August 2006 07:44
von KarlHeinz
zeile 89:

Code: Alles auswählen

signal(SIGUSR1,handler);
und der handler ist so implementiert:

Code: Alles auswählen

void mainwindow::handler(int i){}

Verfasst: 18. August 2006 09:57
von Einmaliger
Ist die handler-Methode "static" deklariert? Sonst erwartet sie einen "unsichtbaren" Parameter, nämlich das Objekt und passt nicht auf die Signatur. Außerdem würde ich sie dann als mainwindow::handler übergeben.

Verfasst: 18. August 2006 10:09
von KarlHeinz
Vielen Dank!

Die Methode war nicht als static deklariert! Jetzt geht es.

Nochmals vielen Dank für die ganzen Antworten.

Mit freundlichen Grüßen,

KarlHeinz

Re: [gelöst] Signalbehandlung in C++

Verfasst: 31. August 2011 11:01
von Alex66955
KarlHeinz hat geschrieben:Vielen Dank!
Die Methode war nicht als static deklariert! Jetzt geht es.
KarlHeinz
Ich habe momentan das selbe Problem und möchte meine Applikation durch SIGTERM und SIGINT sauber beenden. Aber das static verbietet mir den Aufruf von Klassenfunktionen oder Signale. Wie kann ich mein vorhaben realisieren?

Code: Alles auswählen

void signal_handler(int signal){
	// Applikation beenden falls Signal SIGTERM oder SIGINT
	if(signal == SIGTERM or signal == SIGINT){
                 //senden eines Signals
	}
}
[EDIT]: Was mir so spontan einfällt:
Einen Flag einer static variable zu setzen und den wiederum von einer nicht static Funktion zyklisch zu überprüfen.. Gibt es eine andere Möglichkeit??

Gruß Alex