So da bin ich wieder mit nem neune Problem.
Diesmal gehts um Threads. Ziel soll es sein, die Kommunikation (auf der Clientseite) zwischen Server und Client in einem eigenen Thread zu programmieren. Dazu habe ich mir eine eigene Klasse erstellt, welche die Netzwerkfunktionen (biser nur Connect, Disconnect und Send) implementiert. Das Objekt, das ich aus dieser Klasse erstelle, soll vom Connect bis zum Disconnect existieren, in einem eigenen Thread laufen und beim Disconnect wieder vernichtet werden (bzw. der zugehörige Thread soll beendet werden).
Das Threadprinzip mit QT (und auch mit der pthread Lib) ist klar. Allerdings erstelle ich derzeit praktisch nur eine Funktion, welche in einem Thread läuft - ich will aber das komplette Objekt mit all seinen Funktionen im Thread haben. Vielleicht wirds mit dem Codeausschnitt einfacher:
Im Code seht Ihr oben die Headerfile, in der ich die Klasse QTHread reimplementiere. Die Funktion run() erzeugt einen neuen Thread. Allerdings macht dieser Thread wirklich nur das, was in run() weiter unten steht. Alle anderen Funktionen (insbesondere send() ) sind nicht Bestandteil dieses Threads. Zumindest haben das meine Versuche mit sinnlosen Zählschleifen ergeben - nur eine CPU wird belastet. Wenn ich die Schleife aber in die run() mache, sind beide CPUs dran.
Ich hoffe Ihr versteht was ich auszudrücken versuche. Ich weiß einfach nicht, wie ich all die Funktionen der Klasse in einen Thread packen kann (bzw. ob das überhaupt geht).
Die QT Thread Examples (vor allem der QTThreadedFortuneServer) schreiben einfach alles in die run() rein - also vom Erstellen des Sockets zum Senden der Daten bis hin zur Terminierung des Sockets - logisch, dass dann alles in nem eigenen Thread läuft. Aber klappt hier nicht...
Diesmal gehts um Threads. Ziel soll es sein, die Kommunikation (auf der Clientseite) zwischen Server und Client in einem eigenen Thread zu programmieren. Dazu habe ich mir eine eigene Klasse erstellt, welche die Netzwerkfunktionen (biser nur Connect, Disconnect und Send) implementiert. Das Objekt, das ich aus dieser Klasse erstelle, soll vom Connect bis zum Disconnect existieren, in einem eigenen Thread laufen und beim Disconnect wieder vernichtet werden (bzw. der zugehörige Thread soll beendet werden).
Das Threadprinzip mit QT (und auch mit der pthread Lib) ist klar. Allerdings erstelle ich derzeit praktisch nur eine Funktion, welche in einem Thread läuft - ich will aber das komplette Objekt mit all seinen Funktionen im Thread haben. Vielleicht wirds mit dem Codeausschnitt einfacher:
Code:
#ifndef MYNET_H
#define MYNET_H
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <QThread>
#include <QTcpSocket>
#include <QTNetwork>
class Mynet : public QThread
{
Q_OBJECT
public:
void run();
int cState;
void connectToServer(int port, QString ip);
void sendData(int current_commands[], int block_size);
void disconnect();
public slots:
void connectionOK();
void connectionFailed();
signals:
void connected();
void notConnected();
void connecting();
private:
QTcpSocket cli_sock;
};
#endif
void Mynet::run()
{
connect(&cli_sock, SIGNAL(connected()), this, SLOT(connectionOK()));
connect(&cli_sock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionFailed()));
cState = 0;
}
void Mynet::connectToServer(int port, QString ip)
{
cli_sock.connectToHost(ip, port, QIODevice::ReadWrite);
cState = -2;
emit connecting();
}
void Mynet::connectionOK()
{
cState = 1;
emit connected();
}
void Mynet::connectionFailed()
{
cState = -1;
emit notConnected();
}
void Mynet::sendData(int current_commands[], int block_size)
{
int sent;
cli_sock.write((const char*)current_commands, block_size);
}
void Mynet::disconnect()
{
cli_sock.disconnectFromHost();
cState = 0;
}
Im Code seht Ihr oben die Headerfile, in der ich die Klasse QTHread reimplementiere. Die Funktion run() erzeugt einen neuen Thread. Allerdings macht dieser Thread wirklich nur das, was in run() weiter unten steht. Alle anderen Funktionen (insbesondere send() ) sind nicht Bestandteil dieses Threads. Zumindest haben das meine Versuche mit sinnlosen Zählschleifen ergeben - nur eine CPU wird belastet. Wenn ich die Schleife aber in die run() mache, sind beide CPUs dran.
Ich hoffe Ihr versteht was ich auszudrücken versuche. Ich weiß einfach nicht, wie ich all die Funktionen der Klasse in einen Thread packen kann (bzw. ob das überhaupt geht).
Die QT Thread Examples (vor allem der QTThreadedFortuneServer) schreiben einfach alles in die run() rein - also vom Erstellen des Sockets zum Senden der Daten bis hin zur Terminierung des Sockets - logisch, dass dann alles in nem eigenen Thread läuft. Aber klappt hier nicht...