Seite 1 von 1

Signal (short[],short[],int,int) mit Slot(..) verbinden

Verfasst: 1. Juli 2011 12:03
von Martin_1961
Hallo,
ich möchte in einer Klasse, in der ich Messdaten erfasse ein Signal erzeugen, und mit einem Slot in der Mainform verbinden. Im MainForm soll dann die weitere Verarbeitung des Signals erfolgen.
dazu habe ich folgendes gemacht:

Code: Alles auswählen

//in collectData header
short mess1[1024]
short mess2[1024]
int c1,c2;
signal
   OnNewData(short[],short[],int,int);

//in einem Thread in CollectData.cpp
   void CollectData::NewData()
{
//... Daten werden in mess1 und mess2 erfasst. es funktioniert auch
//     nun möchte ich die Daten an MainForm weitergeben
//    Datenerfassen(mess1,mess2,c1,c2)
   emit OnNewData(mess1,mess2,c1,c2);
 
}
in Mainform header

Code: Alles auswählen

slots:
private slots:
    void NewData(short mess1[],short mess2[],int count1,int count 2);

in MainForm.cpp

void MainWindow::NewData(short m1[], short m2[], int count1,int count2)
{
    int counter = 0;
    QString svalue;QString svalue2 =QString::number(count)+"\r\n";

    for(int i = 0;i<100;i++)
    {
      svalue2 +=  svalue.sprintf("%d,",m1[i]);
    }
      qDebug()<< svalue2;
}

void MainWindow::CreateConnections()
{
connect(CollectData,SIGNAL(OnNewData(short[],short[],int,int)),this,SLOT(NewData(short[],short[],int,int)));
}

aber der Inhalt vom Array in MainForm ist Naja (Schrott :-()

wie kann ich nun beim Feuern des Signals die Arrays übergeben?

Danke

Verfasst: 1. Juli 2011 13:00
von Christian81
Benutze korrekte Container für deine Daten anstatt globaler Variablen. Dann sollte es auch besser klappen. Ansonsten wie immer -> minimales, kompilierbares Beispiel!

Verfasst: 1. Juli 2011 13:01
von Martin_1961
Danke Christian, bae es so zum laufen gebracht :-)

Code: Alles auswählen

void OnNewData(short*,short*,int,int);

Verfasst: 1. Juli 2011 15:10
von franzf
Martin_1961 hat geschrieben:Danke Christian, bae es so zum laufen gebracht :-)

Code: Alles auswählen

void OnNewData(short*,short*,int,int);
Das war aber nicht gemeint!
Du sollst das nackte short-Array durch eine QList<short> (o.Ä.) ersetzen. Das obige Beispiel kann nämlich ganz böse ins Auge gehen, wenn du mit QueuedConnections arbeitest, und VOR der Abarbeitung des angeschlossenen SLOTS Daten in dem ursprünglihen Array verändert werden. Dann kann es sein, dass im SLOT auf ungültige Daten zugegriffen wird (der int wird ja kopiert - signalisirt doch sicher die Anzahl der Daten, oder?).
Lustig wirds, wenn das Objekt nur temporär existiert, und vor Abarbeitung der angeschlossenen SLOTS das Daten haltende Objekt zerstört wird. Deine beiden short*-Parameter zeigen dann ins Niergendwo - dein Programm läuft in undefiniertes Verhalten.

QList als Parameter hingegen wird im Fall der Fälle KOPIERT - die Parameter existieren unabhängig vom Zustand der Klasse, Probleme werden nicht eintreten.

Verfasst: 6. Juli 2011 08:51
von Martin_1961
Vielen Dank Franzf. Als Neuling in Qt-Welt lernt man dazu :-) Ich werde die Datenstruktur ändern.
Du hast vollkommen recht. Ich schreibe zur Zeit nur kleine Funktionen, um ein wenig zu experimentieren.

Danke