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

  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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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
    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, je veux executer une fonction a chaque appel d'un message et ceci dans un thread.

    DWORD WINAPI ThreadFunc(LPVOID pDt)
    {
    CSoundOut * pOb=(CSoundOut*)pDt;
    pOb->StartPlaying();
    return 0;
    }

    Comme tu vois, c le thread qui execute une fonction, cependant je ne sais pas comment appelé le threadfunc, a chaque message.

    Sachant que le createthread(....) est réalisé au start du programme.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ce que tu peux faire, c'est créér une boucle de messages dans ce thread : Ainsi, ce sera toujours le même thread qui recevra les messages en CALLBACK_THREAD...
    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.

  9. #9
    Membre averti
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut
    La question est comment faire? Boucle de message dans thread? CALLBACK_THREAD... le liens??

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Un truc de ce genre:
    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
    DWORD WINAPI ThreadFunc(LPVOID pDt)
    {
    	CSoundOut * pOb=(CSoundOut*)pDt;
    	pOb->StartPlaying();
     
    	MSG msg;
    	while(GetMessage(&msg, NULL, 0, 0) > 0)
    	{
    		if(msg.message == MM_WIM_DATA)
    		{	
    		LPWAVEHDR pHdr = (LPWAVEHDR) msg.lParam;
     
    		//...
     
    		}
    	}
    	return 0;
    }
    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.

  11. #11
    Membre averti
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut
    Dis moi, ce qui veux dire donc qu'il n'est plus necessaire de callback_function,

    A chaque CALLBACK_THREAD, le thread va recevoir un message?
    comment savoir le contenu des paramètres envoyer par CALLBACK_THREAD ( dwparam1 .....) ?

    Est ce que le thread peut heriter d'une classe? ou du moins placer la fonction ThreadFunc dans une classe?

    normalement on a DWORD WINAPI ThreadFunc(LPVOID pDt), je peux mettre avec la classe alpha??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Alpha
    {
    public: 
    DWORD WINAPI ThreadFunc(LPVOID pDt);
    }
     
    DWORD WINAPI Alpha ::ThreadFunc(LPVOID pDt)
    {
     
     
    }

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Généralement, param1 etc. sont choisis par la fonction qui a posté le message, pas par toi...

    Une Fonction de thread peut être mise dans une classe, mais uniquement en static.
    Souvent, on utilise un truc de ce genre pour mettre un thread dans une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Alpha
    {
    public: 
    static DWORD WINAPI ThreadFunc(LPVOID pDt);
    DWORD ThreadFunc(void);
    };
     
    DWORD WINAPI Alpha ::ThreadFunc(LPVOID pDt)
    {
    Alpha * pThis = static_cast< Alpha * >(pDt);
    return pThis->ThreadFunc();
    }
    Et bien sûr, en paramètre de CreateThread(), on passe le pointeur vers l'objet...
    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.

  13. #13
    Membre averti
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut
    une fonction qui utilise CALLBACK_THREAD allié à son ID(thread) envoie forcement un message et sera interprété par le thread?

    En d'autre terme je suis sur de retrouver les messages comme MM_WIM_DATA, s'il sont envoyé au thread?

    GetMessage(&msg, NULL, 0, 0) > 0 ca signifie : si il ya un message c validé, et on stocke le message dans &msg

  14. #14
    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...

  15. #15
    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!

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    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.

  17. #17
    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..)

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    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.

  19. #19
    Membre averti
    Inscrit en
    Août 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 21
    Par défaut
    Donc Problème résolu.

    Je vous remercie!

+ 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