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

Alles rund um die Programmierung mit Qt
Antworten
Martin_1961
Beiträge: 22
Registriert: 1. Juni 2011 13:23

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

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Benutze korrekte Container für deine Daten anstatt globaler Variablen. Dann sollte es auch besser klappen. Ansonsten wie immer -> minimales, kompilierbares Beispiel!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Martin_1961
Beiträge: 22
Registriert: 1. Juni 2011 13:23

Beitrag von Martin_1961 »

Danke Christian, bae es so zum laufen gebracht :-)

Code: Alles auswählen

void OnNewData(short*,short*,int,int);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Martin_1961
Beiträge: 22
Registriert: 1. Juni 2011 13:23

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