2009-06-28 6 views
1

J'utilise wxwidgets avec boost :: thread. Le fil est un thread de travail qui envoie des événements à l'interface graphique:Crash avec boost :: thread

création de la discussion:

thrd = boost::thread(boost::bind(workerFunction,this)); 

Envoyer un message à l'interface graphique:

wxPostEvent(loWindow, event); 
wxSafeYield(); 

Sous Windows, je ne vois pas de problème , mais au démarrage de l'application sous Linux (Ubuntu 8.10), il s'arrête avec le message d'erreur suivant:

_XCBUnlockDisplay: Assertion `xcb_get_request_sent(dpy->xcb->connection) == dpy->request' failed. 
Aborted 

Qu'est-ce qui me manque? Lorsque la fonction workerFunction n'est pas démarrée dans un thread, cela fonctionne sans problèmes.

Cordialement, /mspoerr

Répondre

0

Le problème était avec les données que j'ai envoyées - pour les données complexes, vous devez utiliser des événements personnalisés. J'ai maintenant mis en place un événement personnalisé et cela fonctionne.

Pour plus d'informations s'il vous plaît voir http://forums.wxwidgets.org/viewtopic.php?t=24663

Merci pour votre aide!

/mspoerr

EDIT: Mise à jour le lien. L'ancien était cassé

+0

Oui, avec ce code que vous avez posté, la raison de l'accident est évidente :) –

+0

Merci pour vos mots exaltants;) – mspoerr

+0

votre lien est brisé. :( – ryanrhee

4

numéros de télécommunication exclus wxYield d'un thread de travail. Seulement faire cela à partir du fil de l'interface graphique. Yield va traiter les événements gui, et est destiné à être utilisé si dans un gestionnaire d'événements GUI vous faites beaucoup de travail et que vous voulez mettre à jour d'autres contrôles et traiter les événements en attente entre les deux. Le Safe dans wxSafeYield signifie qu'il désactive les contrôles de l'interface graphique avant de traiter les événements en attente en premier. Cela vous protégera contre de tels cas, comme entrer dans le gestionnaire d'événements que vous avez appelé wxYield à partir d'une seconde fois, de manière récursive. Cela ne veut pas dire que c'est thread-safe, ou quelque chose comme ça.

Si vous voulez donner le reste du temps, votre thread devrait avoir d'autres threads, appelez wxThread::Yield de wx ou this_thread::yield de boost (en fonction de votre classe de thread) à la place.

+0

Merci pour votre réponse, mais le docu wxWidgets dit: "Rend le contrôle aux messages en attente dans le système de fenêtrage.Ceci peut être utile, par exemple, lorsqu'un processus chronophage écrit dans un texte Sans une production occasionnelle, la fenêtre de texte ne sera pas mise à jour correctement, et sur les systèmes avec le multitâche coopératif, tel que Windows 3.1 d'autres processus ne répondront pas. " Et à mon avis, c'est ce dont j'ai besoin. Lorsque je n'utilise pas cette fonction, l'application Windows se bloque également. /mspoerr – mspoerr

+0

La documentation que vous citez parle d'applications à un seul thread. Si vous souhaitez créer un thread d'arrière-plan, utilisez une fonction du système d'exploitation telle que Sleep (0) (définie dans windows.h) ou l'équilibre boost. –

+0

et quelle est la façon recommandée de mettre en œuvre cela? – mspoerr