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] Equivalent ON_THREAD_MESSAGE


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 21
    Par d�faut [MFC] Equivalent ON_THREAD_MESSAGE
    Bonjour,
    Je voudrais savoir si en Win32 il existe un equivalent a ON_THREAD_MESSAGE.

    LE but �tant d'appeler une fonction lors d'un �v�nement.

    Cette �vennement provient de la fonction WaveInOpen, qui renvoie un CALLBACK_THREAD �v�nement, lorsqu'un buffeur est plein.

    Ce CALLBACK_THREAD est'il utilisable depuis une application WIN32?

    Merci

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Dans la boucle de messages:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0)
    {
    	TranslateMessage(&msg); //si on veut que WM_CHAR marche
    	DispatchMessage(&msg);
    }
    La structure MSG contient un HWND. Celui-ci indique une fen�tre si le message a �t� post� via PostMessage(), ou NULL s'il a �t� post� via PostThreadMessage().

    Donc:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0)
    {
    	if(msg.hwnd == NULL)
    	{
    		//Traitement du message par le thread
    	}
    	else
    	{
    		TranslateMessage(&msg); //si on veut que WM_CHAR marche
    		DispatchMessage(&msg);
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 21
    Par d�faut
    voici le code ou comment ce ON_THREAD_MESSAGE fonctionne:



    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
     
     
    afx_msg void OnMM_WIM_DATA(UINT parm1, LONG parm2);
     
    BEGIN_MESSAGE_MAP(CSoundIn, CWinThread)
    	//{{AFX_MSG_MAP(CSoundIn)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    	ON_THREAD_MESSAGE(MM_WIM_DATA, OnMM_WIM_DATA)
    END_MESSAGE_MAP()
    .
    .
    .
    mmReturn = ::waveInOpen( &m_hRecord, WAVE_MAPPER, &m_Format, m_ThreadID, NULL, CALLBACK_THREAD);
    .
    .
    .
    void CSoundIn::OnMM_WIM_DATA(UINT parm1, LONG parm2)
    {
    	MMRESULT mmReturn = 0;
     
    	LPWAVEHDR pHdr = (LPWAVEHDR) parm2;
    ...}

    En faite comme tu peux le voir, l'information d'appel du thread provient du CALLBACK_THREAD, quand cet �venement survient, le thread est appel� et on app�le la fonction OnMM_WIM_DATA si le message est de type MM_WIM_DATA

    J'ai d�j� ecris le thread, le probl�me c'est d le d�marrer que si j'ai un �venement MM_WIM_DATA, puis le soucis suppl�mentaire c'est que ce thread devra etre lanc� a chaque que fois que MM_WIM_DATA intervient.

    Je ne vois pas comment impl�menter "msg"

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Dis-moi, si j'ai bien compris, tu transposes du MFC en Win32.
    Peux-tu me montrer o� se trouve ta boucle de messages principale ?

    (si tu utilise une bo�te de dialogue modale, la boucle de messages sera comprise dans l'instruction DialogBox(), et tu ne pourras pas g�rer les Thread Messages.
    Mais tu peux remplacer par une bo�te de dialogue non-modale et une boucle de messages...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 21
    Par d�faut
    Alors oui, effectivement je transpose du code MFC en code Win32.

    Je cherche a r�aliser une dll qui sera en charge de capture du son et ecrire sur fichier et discuter avec le programme principale, qui n'utilise pas d'IHM.

    Pour ce qui est des boucles de messages, je n'y connais rien.

    Ce que je peux te dire ce que pour palier au manque en Win32 equivalent au MFC j'ai r�alis� la chose suivante:

    Ajout d'une fonction start qui permet de creer le thread, cette fonction est d�marrer par le prog principale.

    J'ai modifi� le retour d'info de la part de la fonction waveInOpen, maintenant, cette fonction me renvoie une info de type Callback_function.

    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
     
    DWORD WINAPI ThFunc(LPVOID pDt)
    {
    	CSoundRecDlg *pOb=(CSoundRecDlg*)pDt;
    	pOb->StartRecording();
    	return 0;
    }
     
    BOOL CSoundRecDlg::Start()
    {
     
    bla bla ....Create thread(....ThFunc...)....
    }
     
    BOOL CSoundRecDlg::StartRecord
     
    void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
    {
    	WAVEHDR *pHdr=NULL;
    	switch(uMsg)
    	{
    		case WIM_CLOSE:
    			break;
     
    		case WIM_DATA:
    			{
    				CSoundRecDlg *pDlg=(CSoundRecDlg*)dwInstance;
    				pDlg->ProcessHeader((WAVEHDR *)dwParam1);
    			}
    			break;
     
    		case WIM_OPEN:
    			break;
     
    		default:
    			break;
    	}
    }
     
    VOID CSoundRecDlg::ProcessHeader(WAVEHDR * pHdr)
    {
    // Le code interne que j'avais a l'appel de la fonction ON_THREAD_MESSAGE
    }
    Qu'en penses tu?

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    D�sol�, je ne connais pas WaveIn, donc je ne peux pas faire de commentaire l�-dessus...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    mat.M
    Invit�(e)
    Par d�faut
    Citation Envoy� par fantasma
    Bonjour,
    Je voudrais savoir si en Win32 il existe un equivalent a ON_THREAD_MESSAGE.

    LE but �tant d'appeler une fonction lors d'un �v�nement.
    ..........
    Ce CALLBACK_THREAD est'il utilisable depuis une application WIN32?

    Merci
    J'ai pas tout lu mais je crois qu'il y a d'abord bcp de confusion : tout ce qui se fait avec MFC se fait avec win32 �tant donn� que MFC regroupe win32 en classes..
    Si tu n'est pas convaincu il y a le code source de MFC install� avec Visual Studio..
    Ensuite je ne conseille pas GetMessage...parce que ce sont des fonctions plutot pour la gestion de messages pour des fen�tres

    Regarder dans le MSDN autour de EVENT et synchronisation des "EVENTS"
    Notamment CreateEvent ,ResetEvent...

  8. #8
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 21
    Par d�faut
    bon, r�sultat final, ca fonctionne nickel !!
    avec la boucle des msg, je veux bien utiliser autre chose mais comment en WIN32 synchroniser le thread avec des getevent.

    Sinon encore un grand merci!

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Si tu veux savoir comment on attend un Event en Win32, c'est assez simple:
    On utilise WaitForSingleObject() ou une de ses fonctions soeurs plus compliqu�es.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 21
    Par d�faut
    Je ne pense pas que ceci soit applicable dans mon cas?

    La fonction waveinopen envoie un message contenant deux parametres tout les x buffers...r�p�tition de l'�v�nement.

    D'une part on ne supprimerai pas le while, d'autre part, WaitForsingleObject() recoie un �venement sans param�tres? je me trompe?
    WaitForSingleObject(hwnd..)

  11. #11
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    En effet.
    Pour le cas pr�sent, je pense qu'il vaut mieux garder la boucle de messages.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Equivalent de cout en MFC ?
    Par zelchico dans le forum MFC
    R�ponses: 9
    Dernier message: 07/01/2008, 21h46
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    R�ponses: 8
    Dernier message: 08/06/2005, 15h57
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    R�ponses: 7
    Dernier message: 14/08/2002, 11h55
  4. R�ponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    R�ponses: 2
    Dernier message: 08/05/2002, 07h43

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