Seite 1 von 1

[gelöst] QThread Knoten im Kopf

Verfasst: 25. Oktober 2007 09:43
von bw1faeh0
Hallo Leute,

ich möchte folgendes Problem mit zwei Threads lösen:

Thread 1 liest Daten von einer Hardware ein (Pollen) und schreibt diese in eine QList

Thread 2 liest die Daten aus der Qlist und schickt sie an die Ausgabe weiter.

Nun meine Frage dazu: Wie gehe ich dieses Problem an?

Ich wollte es so machen:
Erzeugung einer Klasse pollThread, die von QThread abgeleitet wird. Übergabe einer existierenden QList an den Konstruktor von pollThread.
Erstellung von einem Timer in pollThread, der regelmäßig die hardware abfragen soll.
dazu will ich das timeout-signal mit einem private slot in QThread verbinden. Kann ich das so machen?

grüße

Christian

Verfasst: 25. Oktober 2007 09:49
von Christian81
Ja, nur den Zugriff auf die QList<> musst Du oich synchronisieren.
Oder, wie ich schon in einen anderen Thread vorgeschlagen habe, die Daten einfach per Signal verschicken.

Verfasst: 25. Oktober 2007 10:51
von bw1faeh0
mhh... aber irgendwie mag der Compiler das Ganze ganz und garnicht

Schon an der Header-Datei muckt er rum:

Code: Alles auswählen

#ifndef __FMBSNIFFER_H__
#define __FMBSNIFFER_H__

#include "global.h"
#include "Workspace.h"
#include "fmbmonitor.h"
#include <QList>

enum
{
	c_POLL_INTERVALL = 10
};

enum
{
	c_OPEN_CONNECTION_INTERVALL = 1000
};

Code: Alles auswählen

class PollThread:public QThread
{
public:
	PollThread(QList *usedTelegramList);
	~PollThread();
	
	void start();
	
private slots:
	void readFromHardware();

private:
	QList	*telegramList;
	unsigned long i_list;		
	QTimer	*pollTimer;
	QString *newTelegram;
	
	
protected:
	void run();
};

Code: Alles auswählen

class SendThread : public QThread
{
public:
	SendThread(QList *usedTelegramList, Workspace *usedWorkspace)
	start();
	
private:
	QList		*telegramList;
	QString		*telegram;
	QTimer		*sendTimer;
	Workspace	*workspace;
	
protected:
	void run();	
};

Code: Alles auswählen

class FmbSniffer{
public:
	FmbSniffer(fmbMonitor *mainWindow,  Workspace *usedWorkspace)
;
	~FmbSniffer();

public slots:
	void openConnection();
	
private:
	PollThread	*pollFmbSniffer;
	QTimer		*connectionTimer;
	SendThread	*sendToView;
	QList		*telegramList;
	
	
	bool		connected;
	
	//	Verweise auf bereits existierende Objekte
	fmbMonitor	*mainApp;
	Workspace	                *workspace;
};

#endif /*__FMBSNIFFER_H__*/

Der compiler meint folgendes dazu:


FmbSniffer.h:22: error: expected `)' before '*' token
FmbSniffer.h:31: error: ISO C++ forbids declaration of `QList' with no type
FmbSniffer.h:31: error: expected `;' before '*' token
FmbSniffer.h:44: error: expected `)' before '*' token
FmbSniffer.h:48: error: ISO C++ forbids declaration of `QList' with no type
FmbSniffer.h:48: error: expected `;' before '*' token
FmbSniffer.h:57: error: expected `)' before '*' token
FmbSniffer.h:57: error: expected `,' or `;' before '*' token

Warum gibt es die Probleme mit QList??

Habe ich gerade ein großes Brett vorm Kopf??

Verfasst: 25. Oktober 2007 10:56
von Christian81
Siehe Doku zu QList. Es ist ein Template!

Verfasst: 25. Oktober 2007 11:02
von bw1faeh0
kopf->Tischkante...

kaum macht man es richtig, da geht es ;)

Verfasst: 25. Oktober 2007 11:07
von Christian81
Hehe,

aber wie gesagt ist das ganze noch thread-sicher zu machen. Also noch einen QMutex rein damit der Zugriff auf die QList<> synchronisiert werden kann.

Verfasst: 25. Oktober 2007 11:20
von bw1faeh0
Danke für den Tipp