2011-01-10 11 views
2

Ich habe es aufgegeben, eine GUI direkt über die Windows-API zu erstellen, daher werde ich Formulare verwenden. Ich möchte meine App multithread und wickeln Sie die GUI in eine Klasse und legen Sie es in einem separaten Thread. Wenn ich auf eine Schaltfläche usw. klicke, würde dies einen Wert in einer Struktur ändern, der vom Hauptthread gelesen wird. Mein Problem ist, wenn ich meine Anwendung kompiliere, bekomme ich einen Fehler mit dem Linker.Verwenden von Boost-Threads beim Kompilieren mit/clr

 
1>Core.obj : error LNK2022: metadata operation failed (8013119F) : A TypeRef exists which should, but does not, have a corresponding TypeDef: (dummy): (0x0100001f). 

Mein Code für Haupt ist wie folgt.

 
int main() 
{ 
//create thread object pointer 
    boost::thread *GUIThread; 
//create pointer to GUIInterface, which contains a member function that 
//contains the Application::Run 
    GUIInterface *myinterface; 
    myinterface = new GUIInterface; 

    GUIThread = new boost::thread(boost::bind(&GUIInterface::MainFunction, myinterface)); 
    return 0; 
} 

Es funktioniert gut, wenn die Klasse zu schaffen und die Funktion im Hauptthread aufrufen, aber boost Probleme verursacht. Ich habe Boost mit dem richtigen Compiler MSVC-10.0 erstellt und die Threading-Bibliothek hat immer in der Vergangenheit funktioniert, aber clr verursacht nur Probleme. Gibt es Empfehlungen, wie Sie das beheben können? ODER wenn ich nur .net Multithreading verwenden sollte (wenn ich das tue, brauche ich wirklich einige Links, wie in C++ zu verwenden, die meisten Sachen, die ich finde, ist in C#). Danke.

+1

Sie erhalten diesen Fehler, weil boost :: thread r-Wert Referenzen verwendet. Wird vom verwalteten Linker nicht unterstützt. Sie sind auf dem Weg zu einem Zugunglück, eine Benutzerschnittstelle ist nicht etwas, das Sie einfach anschrauben können. Sie müssen ein Singlethread-Apartment erstellen, eine Benutzeroberfläche ist grundsätzlich Thread-unsicher. Ich bin mir nicht sicher, wie ich dich aus Schwierigkeiten heraushalten kann. –

+1

Ist es möglich, Boost ohne Rvalues ​​zu bauen? – contrapsych

Antwort

2

Es gibt zwei Probleme bei der Verwendung von boost::thread in einer verwalteten Anwendung. Der erste ist der Linkerfehler, auf den Sie gestoßen sind. Die zweite ist ein Initialisierungsfehler beim Start der Anwendung, wenn die Implementierung statisch mit Ihrer Anwendung verknüpft ist.

Beide Probleme sind in einem older bug report erwähnt. Ich weiß nicht, ob sich das in späteren Versionen geändert hat; 1.43 hat das gleiche Problem. Ich nehme an, nicht wie der Fall wurde wontfix geschlossen.

Verwandte Themen