IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multithreading Discussion :

Problème d'accès concurrentiel ?


Sujet :

Multithreading

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut Problème d'accès concurrentiel ?
    Bonsoir,

    J'ai une application avec une classe qu'on va appeler MaClasse et qui hérite de QWidget, dans MaClasse j'ai plusieurs QLineEdit et un QPushButton.

    J'ai créé un Slot dans MaClasse que j'ai lié lorsque l'utilisateur clique sur le bouton.

    Le soucis est que dans mon Slot, je fais un affichage de ce qu'il y a dans un de mes QLineEdit (propriété text) sauf qu'il n'aime pas, c'est comme si j'essayais d'accéder a une ressource partagée, ce qui n'est pas faux mais comment puis-je régler mon probleme ? sans me prendre la tête avec des mutex

    Cordialement,
    AnaT

    Une partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Le slot :
    void	MainWindow::formValidation()
    {
    	std::cout << this->_ip->text().toStdString().c_str() << " port : " << this->_port->text().toUShort() << std::endl;
    }
     
    une partie de la classe :
    class MainWindow : public QWidget
    {
    	Q_OBJECT
     
        private:
        QPushButton* _start;
    	QLineEdit* _ip;
    	QLineEdit* _port;
    	public slots:
    	void formValidation();
     
    };
     
    mon connect :
    QObject::connect(this->_start, SIGNAL(clicked()), this, SLOT(formValidation()));

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par anat1212 Voir le message
    sauf qu'il n'aime pas
    c'est à dire?


    sans me prendre la tête avec des mutex
    Tu utilise des thread?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Enfaite j'essayais de faire un affichage sur la console et là ce que ca me fait c'est soit j'ai des caractères étrange mélangé avec les bons caractères, soit carrement la chaine ne semble pas se terminer par un nullbyte du coup ca lit toute la mémoire jusqu'a planter [bibliotheque runtime configuré en multithread].


    Apres je n'ai rien fait de spécial... sous linux ca marche tres bien avec le meme code...




    Aussi j'ai fait comme ca ... je lance Qt, après mon application utilise la SFML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int QtLauncher(int ac, char **av, Client *client)
    {
    	QApplication app(ac, av);
    	MainWindow qtwindow(client);
    	qtwindow.show();
    	return app.exec();
    }
     
     
    int main(int ac, char **av)
    {
    	Client *client = new Client();
    	QtLauncher(ac, av, client);
    ...
    Je viens de penser que c'est peut être moc qui compile mal mon slot parce que le bug se trouve dans un slot ou il y a une incompatibilité avec VS


    Je suis désolé de ne pas être plus compréhensible mais je ne comprends pas pourquoi j'ai un tel bug

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je ne comprend vraiment pas ce que tu veux faire...

    Tu as essayer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int QtLauncher(int ac, char **av, Client *client)
    {
    	QApplication app(ac, av);
    	MainWindow qtwindow(client);
    	qtwindow.show();
    	return app.exec();
    }
     
     
    int main(int ac, char **av)
    {
    	Client *client = new Client(); //fuite...
    	return QtLauncher(ac, av, client);
    }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Je ne comprend vraiment pas ce que tu veux faire...

    Tu as essayer le code suivant :
    Mais non j'ai du code après avoir fait mon QtLauncher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(int ac, char **av)
    {
    	Client *client = new Client();
    	QtLauncher(ac, av, client);
    	if (client->getNetwork().isConnected())
    	  client->run();
    	return (0);
    }

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Citation Envoyé par yan Voir le message
    c'est à dire?



    Tu utilise des thread?
    Est-ce que ce que je fais nécessite des threads ?

    avec la description que j'ai donne plus haut de mon organisation.

    Enfin il y aurait dans ce cas un thread dans le slot, mais est-ce utile ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Client hérite de quoi ? Est-ce qu'il est bien libéré ?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par anat1212 Voir le message
    Est-ce que ce que je fais nécessite des threads ?
    non, mais comme tu parle de mutex, je demandais

    Tu écrit comment sur la console?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Je supprime bien mes ressources dans le destructeur,
    Je fais un std::cout pour l'affichage, j'ai aussi essayé en créant un nouveau string

    Code transcendant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	std::string ip(_ip->text().toStdString());
    	std::cout << ip << std::endl;
    et comme j'étais dans le doute que la chaine puisse être non initialisé dans le constructeur je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	this->_ip = new QLineEdit("", this);
    	this->_ip->move(160, 160);
    Enfaite voici tout le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #include "MainWindow.hpp"
     
     
    MainWindow::MainWindow(Client * client)
    {
    	setWindowTitle("*****");
    	setFixedSize(428, 320);
    	setStyleSheet("QWidget { background-color: #000000; }"
    		" QLineEdit{ color: black; background-color: #FFFFFF; }"
    		" QPushButton { color: white; } "
    		" QCheckBox { color: white; } "
    		" QLabel { color: white; }"
    		);
     
    	this->_client = client;
     
    	this->_ipLabel = new QLabel("IP :", this);
    	this->_ipLabel->move(130, 160);
     
    	this->_ip = new QLineEdit("", this);
    	this->_ip->move(160, 160);
     
     
    	this->_portLabel = new QLabel("Port :", this);
    	this->_portLabel->move(130, 190);
    	this->_port = new QLineEdit(this);
    	this->_port->move(160, 190);
     
    	this->_fullScreen = new QCheckBox("Plein ecran", this);
    	this->_fullScreen->move(190, 220);
     
    	this->_start = new QPushButton("Commencer la partie", this);
        this->_start->setCursor(Qt::PointingHandCursor);
        this->_start->move(170, 250);
     
    	this->_warning = NULL;
     
     
    	this->_SplashImage = new QLabel(this);
    	this->_SplashImage->setPixmap(QPixmap("../ressources/*****.png"));
        this->_SplashImage->move(0, 0);
     
    	QObject::connect(this->_start, SIGNAL(clicked()), this, SLOT(formValidation()));
    }
     
     
    MainWindow::~MainWindow()
    {
    	std::cout << "Appel du destructeur de MainWindow" << std::endl;
    	delete this->_start;
    	if (this->_warning != NULL)
    		delete this->_warning;
    	delete this->_ip;
    	delete this->_ipLabel;
    	delete this->_port;
    	delete this->_portLabel;
    	delete this->_fullScreen;
    	delete this->_SplashImage;
    }
     
     
    void	MainWindow::formValidation()
    {
    this->_port->text().toUShort() << std::endl;
    	std::string ip(_ip->text().toStdString());
    	std::cout << ip << std::endl;
    	if (this->_ip->text().length() == 0 || this->_port->text().length() == 0)
    	{
    		_warning = new QMessageBox(QMessageBox::Warning, "Probleme", "Vous n'avez pas saisie tous les champs");
    		_warning->show();
    	}
    	else
    	{	
    		if (_client->getNetwork().tryConnect(this->_ip->text().toStdString(), this->_port->text().toUShort()))
    		{
    		 this->close();
    		}
    		else
    		{
    		_warning = new QMessageBox(QMessageBox::Warning, "Probleme", "Connection timed out");
    		_warning->show();
    		}
    	}
    }

    La classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #ifndef			MAINWINDOW_HPP_
    # define		MAINWINDOW_HPP_
     
    #include <QtGui/QApplication>
    #include <QtGui/QWidget>
    #include <QtGui/QPushButton>
    #include <QtGui/QLineEdit>
    #include <QtGui/QCheckBox>
    #include <QtGui/QLabel>
    #include <QtGui/QMessageBox>
    #include <SFML/Network.hpp>
    #include "Client.hpp"
     
    class MainWindow : public QWidget
    {
    	Q_OBJECT
     
        public:
        MainWindow(Client * client);
    	~MainWindow();
     
        private:
        QPushButton* _start;
    	QPushButton* _exit;
    	QLineEdit* _ip;
    	QLineEdit* _port;
    	QCheckBox* _fullScreen;
     
    	QLabel* _SplashImage;
    	QLabel* _ipLabel;
    	QLabel* _portLabel;
     
    	Client* _client;
    	QMessageBox* _warning;
    	public slots:
    	void formValidation();
     
    };
     
    #endif

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    rien de bien choquant....Je dirais que tu as un problème d'encodage pour une raison inconnue
    Si tu utilise qDebug() au lieu de std::cout, ça résoud ton problème?

    Deux trois petites choses (pas trop grave) que j'ai vue :
    • pas besoin de faire this->
    • pas besoin de faire les delete sur les QObject s'ils ont un parent. Le parent détruit ses enfants.
    • pas besoin de tester si un pointeur est null avant un delete. Le delete le fait déjà.
    • les noms commençant pas _ sont réservés au compilateur.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Bon bah après demande, il semble qu'il s'agirait d'une erreur au niveau du linkage, Qt étant en librairie dynamique et SFML en statique ca fout la merde,

    Enfaite si je fais DLL de débogguage multithread ca plante mon SFML et si je fais l'inverse ca plante mon Qt



    Je rappel que l'appli marche très bien sous linux

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    tu es sous visual?
    si oui, il faut que tu utilise le debug avec le debug et le release avec le release.

    Je pense qu'il y as quand même une erreur mémoire quelque part et sa tombe en marche sous linux (pour l'instant)

Discussions similaires

  1. Problème accès concurrentiel
    Par cefabien dans le forum Websphere
    Réponses: 1
    Dernier message: 28/09/2010, 13h54
  2. Réponses: 0
    Dernier message: 20/05/2010, 10h46
  3. Problème de "Violation de l'accès concurrentiel"
    Par Marc_27 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/06/2009, 16h24
  4. problème violation acces concurrentiel
    Par fetsa054 dans le forum VB.NET
    Réponses: 0
    Dernier message: 10/03/2009, 15h07
  5. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo