2017-07-21 3 views
0

Je veux accéder à mon interface utilisateur de boîte de dialogue (zone d'édition) dans une fonction multithread qui est je définir la fonction globale ou indépendante. CSampleDlg* m_dlg=(CSampleDlg*)_param; est ici _param est un paramètre de la fonction de thread. quand j'ai essayé ce son plantage ici: ASSERT(::IsWindow(m_hWnd));Comment faire pour prendre un pointeur de classe de dialogue dans une fonction multithread MFC

// ici est un exemple de code mfc

UINT MessageThread(LPVOID _param) 
{ 
    CServerDlg* m_dlg=(CServerDlg*)_param; 
    char cChar[1024]; 
    CString strmsg=L""; 

    while (!stopNow && (currValue < maxValue)) 
    { 
     m_dlg->m_messagebox.GetWindowTextW(strmsg); //m_messagebox :editbox 
     sprintf(cChar,"%s",CW2A(strmsg)); 
     char *buff=(char*)&cChar; 
     m_dlg->m_server.Send(buff,sizeof(cChar)); 
     currValue++; 
     Sleep(50); 
    } 

    return TRUE; 
} 
+0

Avez-vous déjà construit votre projet en mode 'Release'? ou Êtes-vous en mode 'Debug'? S'il vous plaît dites-moi ce qui s'est passé après la construction de votre projet en tant que 'Release'. – Bryant

Répondre

1

En utilisant des pointeurs CWnd dans les threads est dangereux, si vous souhaitez accéder à l'objet de la fenêtre derrière elle. Les pointeurs CWnd sont stockés dans une carte par thread. L'utilisation d'une fonction API de la fenêtre enveloppée par le MFC peut échouer ou lancer un ASSERT.

Vous pouvez utiliser la poignée m_hWnd intégrée et vous pouvez utiliser GetWindowText avec cette poignée. Mais même n'est pas vraiment une bonne solution. L'interface utilisateur et les autres actions worktreadead doivent être strictement séparées. Il est donc préférable d'envoyer les informations que vous voulez envoyer à l'utilisateur par toute autre méthode que d'accéder directement à la fenêtre.

+0

merci vous pouvez me donner un échantillon comment accéder directement à la fenêtre? –

+0

Je l'ai écrit. Vous avez le handle de la fenêtre. Vous pouvez utiliser l'API Windows. Mais d'autres méthodes sont meilleures que j'ai écrites. – xMRi

0

Le m_dlg->m_messagebox.GetWindowTextW(strmsg); est une instruction très dangereuse d'un thread de travail. De même, il n'est pas conseillé de passer le pointeur de CDialog sur les threads.

De nombreuses solutions sont possibles pour votre problème même sans passer le pointeur de CDialog au fil. Je suppose que vous voulez suivre les changements de texte dans un contrôle d'édition dans votre boîte de dialogue et le passer à un server en utilisant le thread de travail. Vous pouvez choisir d'avoir un tampon global dans lequel vous pouvez copier du texte depuis le contrôle d'édition, puis envoyer une notification au thread pour l'envoyer. Ne pas oublier de prendre lock sur une mémoire tampon globale avant de copier les données.

Vous pouvez même penser à utiliser un objet CList pour gérer la liste des textes à envoyer au serveur. GUI va push textes à envoyer au serveur dans Clist objet. Et votre fil peut pop texte (si disponible) de CList et l'envoyer au serveur.

+0

merci beaucoup pour donner une direction je ne comprends pas réellement comment envoyer des données si je n'ai pas permis d'accéder à la classe actuelle comment envoyer des données dans le fil par l'accès membre actuel de classe je devrais l'utiliser ou non? –

+0

Vous pouvez passer l'instance de 'm_server' à la fonction thread qui vous permettra d'envoyer des données. Le meilleur moyen est d'avoir une classe 'ServerHandler' distincte qui aura une fonction de thread et une instance de socket. Votre interface utilisateur doit simplement mettre les données à la disposition de la classe 'ServerHander' pour les envoyer au serveur. – MKR

0

"Comment prendre un pointeur de classe de dialogue dans une fonction multithread MFC"? Ce n'est pas le cas. Tout objet qui a un handle, y compris l'objet fenêtre MFC doit passer un handle au thread. La poignée est unique. Si vous envoyez un pointeur, il pointe vers une zone différente (le cas échéant) dans le stockage local de threads. Utilisez l'API Envoyer/Post message pour envoyer des messages à la boîte de dialogue. Vous pouvez utiliser des messages définis personnalisés ou des messages enregistrés.