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

MFC Discussion :

[MFC] CArchive dans une thread


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut [MFC] CArchive dans une thread
    Bonjour tout le monde ^^


    J'aimerais savoir si �a peut poser des probl�mes d'utiliser une CArchive dans une thread car lorsque j'en utilise une dans mon programme principal je n'ai aucun probl�me, mais lorsque je la mets dans une thread, j'ai une assertion failed en ex�cution.


    Quelqu'un a d�j� eu un probl�me similaire? Je pense que mes d�clarations sont correctes et je n'arrive pas � cerner le probl�me...


    Merci d'avance ^^

    (si mes explications ne sont pas claires, dites-le, je pr�f�re r�expliquer que rester sans r�ponse ^^")

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    �a ne devrait pas causer de probleme .
    par contre c'est peut etre les donn�es a archiv�es qui peuvent causer un probleme.(les moyens mis en oeuvre pour y acceder) .
    sans voir un brin de code et sans details sur le contexte on peut rien dire de plus.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    J'attendais de voir si quelqu'un avait une id�e de ce que �a pouvait �tre avant d'inonder de code

    Le principe est que dans le programme principal, lorsqu'on appelle une fonction Send(), je mets dans une FIFO les �l�ments � envoyer.
    Et dans une thread, je r�cup�re ce qu'il y a dans la FIFO et je l'envois sur le r�seau gr�ce � une archive.

    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
    UINT Connection::ThreadsSend()
    {
    	TRACE("Thread Send\n");
    	while(true)
    	{
    		WaitForSingleObject(wait_send, INFINITE);
    		TRACE("WaitForSingleObject : wait_send\n");
    		if(FIFOimage.GetRemSizeR() == 0)
    		{
    			// Il n'y en a pas! La FIFO est donc vide. Il faut attendre que la thread d'écriture 
    			// place un élément dans cette FIFO...
     
    			TRACE("FIFO EMPTY!\n");
    			WaitForSingleObject(wait_send, INFINITE);
    		} else
    		{
    			strcpy(MyArguments.structHeader.name,"Name");
    			MyArguments.structHeader.numfct = 1;
    			size = 10000;
    			TRACE("Thread Send : %s et %d | size = %d\n",MyArguments.structHeader.name, MyArguments.structHeader.numfct,size);
    			BYTE* jpeg2 = NULL;
    			DWORD size = 0;
    			TRACE("Avant le read %s\n",jpeg2);
    			FIFOimage.Read(MyArguments, size, jpeg2);
    			TRACE("Après le read %s\n",jpeg2);
    			char*jpeg = new char[size];
    			strcpy(jpeg,(const char*)jpeg2);
    			TRACE("Avant l'archive %s et size = %d\n",jpeg, size);
    			TRACE("(sock = %.8x) New : m_pFile -> %.8x | m_pArIn -> %.8x | m_pArOut -> %.8x |\n", incomingSock, m_pFile,m_pArIn,m_pArOut);
    			m_pArOut->Write(jpeg, 10);
    			TRACE("Après le write\n");
    			m_pArOut->Flush();
    			TRACE("Après l'archive\n");
    			FIFOimage.UpdatePtrR();
    		}
    		SetEvent(wait_receive);
    	}
    	return 0;
    }
    J'ai mis des trace un peu partout et la derni�re que je vois est celle avant l'archive.
    Les pointeurs sont identiques dans la thread principale et celle-l�, tout � l'air d'�tre initialis�, je ne vois vraiment pas o� est le probl�me (je suis un peu nulle j'avoue mais bon ^^")
    Acutellement je ne fais pas travailler l'archive avec la FIFO puisque j'essaie de voir quel est le probl�me donc j'essaie b�tement de mettre du texte dans l'archive mais �a ne fonctionne pas...

  4. #4
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    un truc me chiffone dans ton code ,
    la fonction de thread doit etre statique a la classe ,dans ce contexte comment se fait il que tu accedes a des donn�es membres comme m_pArOut etc...
    a moins que tu n'ais redirig� sur une fonction de l'instance a partir de la fonction du thread ...
    autrement cette ligne :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    FIFOimage.Read(MyArguments, size, jpeg2);
    jpeg2 est null c'est normal �a ?


  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Bah normalement, justement, apr�s ce READ, il ne l'est plus.

    En fait c'est une thread sp�ciale, c'est mon maitre de stage qui m'a montr� "ce truc" :


    Thread :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    UINT Connection::ThreadsSend(LPVOID pthis)
    {
    	Connection *me = static_cast<Connection*>(pthis);
    	return me->ThreadsSend();
    }
    Fonction o� va la thread:
    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
    UINT Connection::ThreadsSend()
    {
    	TRACE("Thread Send\n");
    	while(true)
    	{
    		WaitForSingleObject(wait_send, INFINITE);
    		TRACE("WaitForSingleObject : wait_send\n");
    		if(FIFOimage.GetRemSizeR() == 0)
    		{
    			// Il n'y en a pas! La FIFO est donc vide. Il faut attendre que la thread d'écriture 
    			// place un élément dans cette FIFO...
     
    			TRACE("FIFO EMPTY!\n");
    			WaitForSingleObject(wait_send, INFINITE);
    		} else
    		{
    			strcpy(MyArguments.structHeader.name,"Name");
    			MyArguments.structHeader.numfct = 1;
    			size = 10000;
    			TRACE("Thread Send : %s et %d | size = %d\n",MyArguments.structHeader.name, MyArguments.structHeader.numfct,size);
    			BYTE* jpeg2 = NULL;
    			DWORD size = 0;
    			TRACE("Avant le read %s\n",jpeg2);
    			FIFOimage.Read(MyArguments, size, jpeg2);
    			TRACE("Après le read %s\n",jpeg2);
    			char*jpeg = new char[size];
    			strcpy(jpeg,(const char*)jpeg2);
    			TRACE("Avant l'archive %s et size = %d\n",jpeg, size);
    			TRACE("(sock = %.8x) New : m_pFile -> %.8x | m_pArIn -> %.8x | m_pArOut -> %.8x |\n", incomingSock, m_pFile,m_pArIn,m_pArOut);
    			m_pArOut->Write(jpeg, 10);
    			TRACE("Après le write\n");
    			m_pArOut->Flush();
    			TRACE("Après l'archive\n");
    			FIFOimage.UpdatePtrR();
    		}
    		SetEvent(wait_receive);
    	}
    	return 0;
    }
    R�sultat des TRACE :
    WaitForSingleObject : wait_send
    Thread Send : Name et 1 | size = 10000
    Avant le read (null)
    Apr�s le read Thread
    Avant l'archive Thread et size = 18249
    (sock = 002f5270) New : m_pFile -> 002f82b0 | m_pArIn -> 002f8308 | m_pArOut -> 002f93d8 |


    Et le compilateur m'am�ne sur ces lignes lorsque je clique sur r�essayer au lieu de abandonner :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    void CAsyncSocket::AssertValid() const
    {
    	CObject::AssertValid();
    	ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);
    }

  6. #6
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    bon pour le point ok c'est ce que je pensais ...
    un detail se code me semble suspect:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    char*jpeg = new char[size]; 
    strcpy(jpeg,(const char*)jpeg2);
    strcpy copie la zone sur la longueur + le zero .
    reste a savoir si size comprend le zero ou non ....
    si c'st pas le cas tu as un debordement memoire de 1 octet ,qui peut expliquer le probleme qui suit ...

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Je ne sais pas, pcq quand j'essaie avec la structure MyArguments, �a ne fonctionne pas non plus (alors que si je mets ce code tel quel dans le thread principal, il fonctionne)

    Et je viens d'essayer en mettant size+1 mais �a plante tjrs

  8. #8
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    �a n'est pas suffisant les bugs de memoire (debordements etc) peuvent se reveler juste en changeant de contexte .
    le probleme est de savoir si tu debordes en memoire ou non ..
    si tu mets le strcpy(jpeg,(const char*)jpeg2); entre commentaire le write passe ?

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Non, �a ne passe toujours pas.

    Je suis vraiment d�sol�e, je suis pas dou�e ^^"

  10. #10
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    il faut que tu nous donnes le detail de l'assertion d'erreur ....

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Comme je le disais plus haut (j'ai �dit� pendant que tu postais apparement ^^"), mon erreur m'am�ne l� dans le fichier sockcore.cpp

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    void CAsyncSocket::AssertValid() const
    {
    	CObject::AssertValid();
    	ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);
    }

    Mais je viens de trouver un article en anglais et apparement, il faudrait d�tacher le handle du socket avant de rentrer dans la thread, et le rattacher apr�s. Ca parait plausible?


    EDIT :

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcemfc4/html/aflrfCSocketcolcolAttach.asp
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;175668

    Apparement comme �a, �a a l'air de fonctionner, �a ne me plante plus en ex�cution mais du coup, il ne veut pas faire de close sur mon socket, j'ai pas du tout l'habitude d'utiliser les handle de socket :/

  12. #12
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    oui c'est sur que c'est �a ton pb ,
    le probleme c'est les sockets utilisent une notification des messages par l'intermediaire d'une fenetre windows.
    et quand dans le cas d'un workerthread c'sst le travail avec des objets graphiques qui cause un probleme.
    voir faq: http://c.developpez.com/faq/vc/?page...d#WorkerThread

  13. #13
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Erf ok, merci beaucoup ^^

    Faut que j'arrive � r�gler les autres probl�mes maintenant >.>

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [MFC] Dessin dans une boite de dialogue .
    Par Platypus dans le forum MFC
    R�ponses: 8
    Dernier message: 21/07/2005, 11h21
  2. [MFC] CTabCtrl dans une CDialog
    Par eyghon dans le forum MFC
    R�ponses: 1
    Dernier message: 29/04/2005, 19h31
  3. [mfc] affichage dans une boite de dialog
    Par chronos dans le forum MFC
    R�ponses: 3
    Dernier message: 14/06/2004, 15h12
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    R�ponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [MFC] CPropertySheet dans une CFormView ???
    Par Lofwyr dans le forum MFC
    R�ponses: 2
    Dernier message: 30/07/2003, 16h49

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