2012-02-23 1 views
0

Je travaille actuellement sur un programme utilisant MFC. La fonction tierce en cours démarre un thread après l'exécution d'une action à l'aide de MFC (c.-à-d. Cocher une case à cocher, qui démarre un thread MFC je crois).MFC/3ème partie multithreading hang

Le problème se produit lorsque je coche la case, à quel point le programme entier se bloque. J'ai lu quelques discussions intéressantes sur CProgramming et msdn, il semble que le problème se produit parce que le nouveau thread tiers appelle WaitToSomething() lorsque MFC met à jour un contrôle.

Quelque chose intéressante à noter:

  • Quand je déboguer le programme, le programme se bloque (alias appelle à plusieurs reprises WaitToRead().) Après avoir cocher la case et un nouveau thread essaie de démarrer
  • Lorsque Je lance le programme sans débogueur, le programme est bien jusqu'à ce que je passe à une autre fenêtre (ie navigateur Internet, Bloc-notes, etc.)

Mon hypothèse:

  • vérifier pour vous assurer que MFC a terminé la mise à jour de la commande avant de lancer un nouveau thread

Si quelqu'un a des suggestions ou des solutions, s'il vous plaît laisser un commentaire. Merci.

Edit:

MFC est thread-safe au niveau de l'objet (uniquement au niveau de la classe), donc problème se produit lorsque deux threads fonctionnent sur le même objet CButton.

Q: Comment sécuriser le filetage?

+0

pouvez-vous poster des codes quand il démarre un fil. – Turbot

Répondre

0

Un collègue m'a aidé à comprendre quel était le problème. La raison pour laquelle il était suspendu est que le contrôle contenant la case à cocher est un dialogue enfant, et quand il a fini de mettre à jour le message n'a jamais été passé à son parent (donc quand un thread tiers appelle WaitFor(), le MFC le thread ne se termine jamais car un dialogue parent pense que son enfant met toujours à jour les contrôles).

Fix:

'Propriétés' dans le contrôle de la boîte de dialogue des enfants Sous, définissez le drapeau 'Control' pour vrai (et si elle a des enfants, définissez l'indicateur 'Parent Control' à vrai ainsi).

Espérons que cela aide.