Question

J'ai un projet d'interface graphique C ++ présentant un comportement étrange. Sur ma machine, le code est compilé et fonctionne parfaitement. Cependant, sur une autre machine, le code est compilé mais finit par s'exécuter dans MTA. Évidemment, être dans MTA pose toutes sortes de problèmes d'exécution pour l'interface graphique. Voici mon principal:

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

Je peux placer un point d'arrêt sur la première ligne de main pour vérifier l'état de l'appartement, et sur les machines qui construisent / exécutent correctement, ce sera & "STA &"; comme prévu. Cependant, sur les machines problématiques, ce sera & "; MTA &" ;. Je peux même essayer de passer du mode appartement à STA, sans effet.

J'ai essayé de supprimer les répertoires debug / release et de nettoyer le projet avant la compilation, de l'exécuter sans un débogueur attaché, tout cela en vain. Je ne peux déterminer aucun schéma selon lequel les machines fonctionnent ou non. Si je compile l'exe sur une machine en fonctionnement et l'amène sur une machine problématique, il s'exécutera correctement. Je suppose donc qu'il s'agit en quelque sorte d'un problème d'environnement de construction. Toutes les machines concernées exécutent Windows XP avec Visual Studio 2008 Standard. Des idées?

Était-ce utile?

La solution

Je l'ai compris. Notre projet faisait des appels à une dll depuis 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. Les différentes versions de la dll d’une machine à l’autre étaient responsables de l’irrégularité du problème.

Autres conseils

Je viens de terminer la résolution d'un bogue similaire avec OpenCV 1.1 et le code géré. 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). En tout cas 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, tout devrait être corrigé. Vous devrez créer un lien vers 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top