Instance unique et sockets
Bonjour à toutes et à tous,
Dans le cadre d'un projet professionnel, je dois réaliser la communication entre un programme Qt et son interface qui sera déporté sur une page web. Pour cela, je crée une instance unique de mon programme et je dialogue entre la page web et mon programme via QLocalServer et QLocalSocket. Dans un précédent post, on m'a expliquer comment faire mais j'ai des problèmes avec le code donc j'ai besoin de votre aide.
Tout d'abord voici les codes .h et .cpp que j'ai pour l'instant
SingleInstanceApplication.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#ifndef SINGLEINSTANCEAPPLICATION_H
#define SINGLEINSTANCEAPPLICATION_H
#include "mainwindow.h"
class SingleInstanceApplication : public QApplication
{
public:
SingleInstanceApplication(int &argc, char **argv, const QString &uniqueKey);
~SingleInstanceApplication();
bool m_isMainInstance;
private slots:
void localServerHasNewConnexion();
void sendArgumentsToMainInstance(char **argv);
void receiveData();
private:
QLocalSocket *identificateurClient;
QLocalServer *m_localServer;
QLocalSocket *m_socket;
};
#endif // SINGLEINSTANCEAPPLICATION_H |
SingleInstanceApplication.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
#include "mainwindow.h"
#include "SingleApplication.h"
#include "SingleInstanceApplication.h"
#include <QThread>
SingleInstanceApplication::SingleInstanceApplication(int &argc, char **argv, const QString &uniqueKey) : QApplication(argc, argv), m_isMainInstance(false)
{
m_socket = new QLocalSocket();
m_socket->connectToServer(uniqueKey);
// on essaie de se connecter a un potentiel serveur local
if(m_socket->waitForConnected(100))
{
// ca a fonctionné... donc il existe deja une instance de notre logiciel
qDebug("Une instance existe deja");
QThread::msleep(50);
// ex: ca envoi "action_of_my_button" a l instance principale
sendArgumentsToMainInstance(argv);
// on ferme la connection.
m_socket->close();
}
else
{
// ca ne fonctionne pas, donc il n y a pas encore d instance principale...
m_isMainInstance = true;
qDebug("Aucune instance n'existe encore");
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(&QLocalServer::newConnection), this, SLOT(&SingleInstanceApplication::localServerHasNewConnexion()));
m_localServer->listen(uniqueKey);
}
}
void SingleInstanceApplication::localServerHasNewConnexion()
{
if(SIGNAL(QLocalServer::newConnection()))
{
//Si il y a une nouvelle connexion, on accepte la connexion sous la forme d'un QLocalSocket connecté
//La fonction renvoie un pointeur sur un QLocalSocket qui peut être utilisé pour communiquer avec le client
qDebug("Nouvelle Connexion");
identificateurClient = new QLocalSocket();
identificateurClient = QLocalServer::nextPendingConnection();
connect(identificateurClient, SIGNAL(readyRead()), this, SLOT(receiveData()));
}
}
void SingleInstanceApplication::sendArgumentsToMainInstance(char **argv)
{
//Lorsque l'on appuit sur un bouton de l'interface web, par exemple le bouton pour allumer la LED1, cela doit
//envoyer l'action d'appuyer sur le bouton pour allumer la LED1
QLocalSocket::writeData(argv, QLocalSocket::bytesAvailable(argv));
}
void SingleInstanceApplication::receiveData()
{
QLocalSocket *Socket = new QLocalSocket::sender();
QLocalSocket *SocketDouVientLeSignal = qobject_cast<QLocalSocket *>(Socket);
qint64 tailleMot = QLocalSocket::bytesAvailable();
SocketDouVientLeSignal->readData(argv, tailleMot);
} |
et voici les erreurs que j'ai et que je n'arrive pas à résoudre:
Citation:
C:\Qt\Qt5.1.1\Tools\QtCreator\bin\Projet Fusion 2\EssaiCommInternet\SingleInstanceApplication.cpp:45: erreur : cannot call member function 'virtual QLocalSocket* QLocalServer::nextPendingConnection()' without object
identificateurClient = QLocalServer::nextPendingConnection();
C:\Qt\Qt5.1.1\Tools\QtCreator\bin\Projet Fusion 2\EssaiCommInternet\SingleInstanceApplication.cpp:55: erreur : no matching function for call to 'QLocalSocket::bytesAvailable(char**&)'
QLocalSocket::writeData(argv, QLocalSocket::bytesAvailable(argv));
C:\Qt\Qt5.1.1\Tools\QtCreator\bin\Projet Fusion 2\EssaiCommInternet\SingleInstanceApplication.cpp:60: erreur : expected type-specifier
QLocalSocket *Socket = new QLocalSocket::sender();
C:\Qt\Qt5.1.1\Tools\QtCreator\bin\Projet Fusion 2\EssaiCommInternet\SingleInstanceApplication.cpp:62: erreur : cannot call member function 'virtual qint64 QLocalSocket::bytesAvailable() const' without object
qint64 tailleMot = QLocalSocket::bytesAvailable();
J'ai beau éplucher les différentes docs, je n'arrive pas à résoudre mes erreurs
Dans l'attente de votre aide,
Cordialement,
Clairetj