2009-01-29 13 views
1

J'ai un projet C++ gui présentant un comportement étrange. Sur ma machine, le code compile et fonctionne très bien. Cependant, sur une autre machine, le code compile mais finit par s'exécuter dans MTA en quelque sorte. Évidemment, être dans MTA cause toutes sortes de problèmes d'exécution pour l'interface graphique. Voici ma principale:L'application GUI Visual C++ bloquée en mode MTA

 [STAThreadAttribute] 
     int main(array<System::String ^> ^args) 
     { 
      Application::EnableVisualStyles(); 
      Application::SetCompatibleTextRenderingDefault(false); 
      Application::Run(gcnew Form1()); 
      return 0; 
     } 

je peux mettre un point d'arrêt sur la première ligne de principale de vérifier l'état de l'appartement, et sur les machines qui construisent/exécuter correctement, il sera « STA », comme prévu. Cependant, sur les machines problématiques, ce sera "MTA". Je peux même essayer de passer le mode appartement à STA, sans effet.

J'ai essayé de supprimer les répertoires de débogage/libération et de nettoyer le projet avant de compiler, sans exécuter de débogueur, mais en vain. Je ne peux déterminer aucun modèle auquel les machines fonctionnent et qui ne fonctionnent pas. Si je compile l'exe sur une machine de travail et l'amène à une machine problématique, il s'exécutera correctement, donc je pense que c'est en quelque sorte un problème d'environnement de construction. Toutes les machines impliquées exécutent Windows XP avec Visual Studio 2008 standard. Des idées?

+0

.Net ne prend pas en charge la modification de l'état d'appartement pour un thread géré une fois qu'il est en cours d'exécution, ce qui explique cela. Pour le reste je n'ai aucune idée - quel étrange problème ... –

Répondre

1

Compris. Notre projet faisait des appels à une DLL d'openCV, et cette DLL avait été compilée pour plusieurs threads. Visual Studio a remarqué cela et a forcé l'application à compiler pour plusieurs threads. Différentes versions de la DLL d'une machine à l'autre étaient responsables de l'irrégularité du problème.

0

Je viens de finir de corriger un bug similaire avec OpenCV 1.1 et le code managé. Pour une raison quelconque, il semble que les bibliothèques OpenCV forcent l'application dans MTA (peut-être un objet COM dans l'interface OpenCV DShow). Quoi qu'il en soit, j'ai trouvé cette solution: http://www.gamedev.net/community/forums/mod/journal/journal.asp?userid=62708

Si vous ré-initialisez COM dans votre application principale, il devrait tout réparer. Vous devrez lier à OLE32.lib pour utiliser CoUninitialize(). J'ai utilisé le code suivant:

int main(array<System::String ^> ^args) 
{ 

    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA; 
    if (Thread::CurrentThread->GetApartmentState() != ApartmentState::STA) 
    { 
     CoUninitialize(); 
     CoInitialize(NULL); 
    } 

    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it 
    Application::Run(gcnew Form1()); 
    return 0; 
}