[gelöst] Signalbehandlung in C++

Alles rund um die Programmierung mit Qt
KarlHeinz
Beiträge: 5
Registriert: 17. August 2006 09:38

[gelöst] Signalbehandlung in C++

Beitrag 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
Zuletzt geändert von KarlHeinz am 18. August 2006 10:11, insgesamt 1-mal geändert.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Mister_Crac
Beiträge: 28
Registriert: 10. August 2006 12:17

Beitrag 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 ;-)
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

In C++ nutzt man doch normalerweise keine nativen C Dinge mehr, oder? Und in Qt ja gleich überhaupt niemals nicht.
Mister_Crac
Beiträge: 28
Registriert: 10. August 2006 12:17

Beitrag 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 :-)
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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?
Mister_Crac
Beiträge: 28
Registriert: 10. August 2006 12:17

Beitrag 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.
KarlHeinz
Beiträge: 5
Registriert: 17. August 2006 09:38

Beitrag 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
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag 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.
KarlHeinz
Beiträge: 5
Registriert: 17. August 2006 09:38

Beitrag 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)'
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag 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?
KarlHeinz
Beiträge: 5
Registriert: 17. August 2006 09:38

Beitrag 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){}
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag 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.
KarlHeinz
Beiträge: 5
Registriert: 17. August 2006 09:38

Beitrag 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
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

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

Beitrag 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
Antworten