[gelöst] Signals and Slots

Alles rund um die Programmierung mit Qt
Antworten
SaLu
Beiträge: 50
Registriert: 18. August 2008 18:06

[gelöst] Signals and Slots

Beitrag von SaLu »

Ich habe mir das Beispiel über Signal ans slots angeschaut und genau soetwas in der Art habe ich gesucht. Folgendes Szenario. Gui Thread - Thread für serielle schnittstelle - arrayspeicher.

der serielle schnittstellen thread schreibt in das array. Über signal ans slots (connect) wird der gui mitgeteilt das neue daten drin sind. Soweit die theorie die funktionieren sollte :P

nun die Praxis:

gui

Code: Alles auswählen

QObject::connect(data, SIGNAL(valueChange(int,int16_t)),this,SLOT(einlesen1(int,int16_t)));
...
void tabs::einlesen1(int adresse,int16_t wert)
{
  cout<< "neuer Wert"<<endl;
}
data ist hier der pointer auf die klasse in der das array erstellt/befüllt ... wird

seriellthread

Code: Alles auswählen

daten->set(1,speicher.puffer[39]);
        daten->set(1,speicher.puffer[12]);
        
daten ist hier der pointer auf die klasse in der das array erstellt/befüllt wird

arrayklasse.cpp

Code: Alles auswählen

...
void Datenhaltung::set(int adresse,int16_t zahl)
{
  schutz.acquire();
  v[adresse].wert=zahl;
  schutz.release();
  emit valueChange(adresse,zahl);
}
arrayklasse.h

Code: Alles auswählen

class Datenhaltung : public QObject
{
  Q_OBJECT
public:
  Datenhaltung();
  virtual ~Datenhaltung();
  QSemaphore schutz;

public slots:
  void set(int adresse,int16_t zahl);

signals:
    void valueChange(int adresse,int16_t wert);

private:
  intspeicher v[25];
};

#endif /* DATENHALTUNG_H_ */
nun kompilieren tut er und er zeigt keine fehler an. Sobald ich das Programm start schmiert er ab.

hier der problembericht:
AppName: fertig.exe AppVer: 0.0.0.0 ModName: qtcored4.dll
ModVer: 4.4.1.0 Offset: 001609c8

die technischen details dazu poste ich mal nicht. Hoffe es ist nur ein kleiner denkfehler.
Zuletzt geändert von SaLu am 12. September 2008 13:22, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Debugger nehmen und anschauen wo genau er abstürzt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SaLu
Beiträge: 50
Registriert: 18. August 2008 18:06

Beitrag von SaLu »

ähm das ist das nächste problem. hab zwar minigw als debugger usw eingestellt nur irgendwie falsch. Hab das schonmal versucht hinzubekommen aber will wohl nicht wirklich.

Code: Alles auswählen

'Launching fertig.exe' has encountered a problem
Failed to set program arguments,enviroment or working directory
das wahrscheinlich die standart ausgabe.

bei details sagt er dann failed to set working directory mit dem entsprechenden pfad... :(
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du nicht weißt wie Du debuggen kannst, dann bau eben ein paar printf-Ausgaben rein oder sonstwas. Was für ein Compiler wurde ja auch nicht angegeben :(
Ich schätze es ist Eclipse - darüber weiß ich glücklicherweise nichts :D
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SaLu
Beiträge: 50
Registriert: 18. August 2008 18:06

Beitrag von SaLu »

ja es ist eclipse. debugger wäre echt schön. aber ich glaube ich habe das problem gefunden. im konstruktor wo er das connect macht ist der pointer noch nicht bekannt. der pointer wird erst mittels einer methode übergeben, da das übergeben per konstruktor komischweise nicht geht. Wirklich dummer Fehler.

ich versuch es nun zu lösen und geb euch dann bescheid.
Aber vielleicht kann ja jmd was zu eclipse und debuggern sagen. Wäre für manch anderes problem hilfreich
SaLu
Beiträge: 50
Registriert: 18. August 2008 18:06

Beitrag von SaLu »

also es lag wirklich daran. Es führt das connect richtig aus! das nächste Problem ist nun das er nicht emitted. Code wie oben :(. In die Funktion kommt er rein und verändern den Wert.

Edit : das doch typisch. kaum schreibt man rein schon findet man das Problem minuten später. Das int16_t macht probleme :P

Also denke das Problem hat sich erledigt, denke damit werde ich fertig.

Nun noch das debuggen
Zuletzt geändert von SaLu am 11. September 2008 14:13, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich würde mal sagen die Funktion tabs::einlesen1() ist nicht als Slot definiert - Überprüfe dies und schau auch ob QObject::connect() true zurückliefert.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SaLu
Beiträge: 50
Registriert: 18. August 2008 18:06

Beitrag von SaLu »

so debugger und programm läuft. Nun dürfte es leichter fallen.
Problem mit dem Debugger war das eclipse mit dem workspace c:\dokumente und einstellungen nicht zurrechtkam.

:twisted: wegen sowas verbringt man Stunden...
Antworten