2010-04-08 3 views
0

je tentais d'accéder à un des membres wxDialog d'un coup de pouce :: fil:"exception non gérée" erreur lors du mélange boost :: thread avec wxWidgets GUI

void AnotherThread(myWxDialog *dlg) 
{ 
    wxMessageBox(dlg->TextBox1->GetValue(), "It works!"); // This throws an error 
} 

void myWxDialog::OnButtonClick(wxCommandEvent &event) 
{ 
    boost::thread myThread(AnotherThread, this); 
} 

Et je suis arrivé cette erreur:

Unhandled exception at 0x004043d7 in MyProgram.exe: 0xC0000005: Access violation reading location 0xbaadf00d.

Je pense que ce type d'action n'est pas autorisé entre threads différents.

Alors, y a-t-il un autre moyen de faire la même chose?

Toutes sortes d'aide seraient appréciées. :)

(Microsoft Visual C++ 2008 Express Edition)

+0

Il n'y a pas de GUI qui soit compatible avec les threads. Félicitations à wxWidgets pour faire planter votre application lorsque vous essayez. –

Répondre

2

0xbaadf00d indique que vous déréférencer un pointeur non initialisé; si j'étais vous, je creuser plus profond avec le débogueur pour voir exactement ce pointeur est (en dlg? dans TextBox1? dans ce que GetValue() renvoie? Quelque part dans wxMessageBox?). Cela vous aidera à comprendre où est le problème.

encore, la plus grande faute tente d'accéder à des choses de l'interface graphique d'un autre thread: comme explicitement indiqué here,

When writing a multi-threaded application, it is strongly recommended that no secondary threads call GUI functions. The design which uses one GUI thread and several worker threads which communicate with the main one using events is much more robust and will undoubtedly save you countless problems (example: under Win32 a thread can only access GDI objects such as pens, brushes, device contexts created by itself and not by the other threads).

Vous pouvez également y trouver des suggestions sur la façon de contourner ces limitations avec des événements et des autres wxWidgets installations.

+0

Désolé, j'étais trop hâtive de signaler ce problème. Le problème principal est causé par l'accès à la fonction d'un objet disposé du côté de l'interface graphique. Mais votre réponse peut être utile pour d'autres personnes qui ont un problème similaire. Merci. –

Questions connexes