Seite 1 von 1

[gelöst] Signals and Slots

Verfasst: 11. September 2008 11:49
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.

Verfasst: 11. September 2008 12:13
von Christian81
Debugger nehmen und anschauen wo genau er abstürzt.

Verfasst: 11. September 2008 12:24
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... :(

Verfasst: 11. September 2008 12:29
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

Verfasst: 11. September 2008 12:41
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

Verfasst: 11. September 2008 14:04
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

Verfasst: 11. September 2008 14:07
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.

Verfasst: 12. September 2008 13:22
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...