Pergunta

Eu estou usando wxWidgets juntamente com boost :: fio. O segmento é um segmento de trabalho que envia alguns eventos para a GUI:

criação da linha:

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

Enviar Mensagem para o GUI:

wxPostEvent(loWindow, event);
wxSafeYield();

No Windows eu não vejo nenhum problema, mas quando iniciar o aplicativo no Linux (Ubuntu 8.10), ele pára com a seguinte mensagem de erro:

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

O que eu estou ausente? Quando o workerFunction não é iniciado em um segmento, ele funciona sem problemas.

Saudações, / Mspoerr

Foi útil?

Solução 2

O problema era com os dados que enviei - para dados complexos você precisa usar eventos personalizados. Eu agora implementado um evento personalizado e ele funciona.

Para obter mais informações, consulte http://forums.wxwidgets.org/viewtopic. php? t = 24663

Obrigado por sua ajuda!

/ mspoerr

EDIT: Atualizado o link. O velho foi quebrado

Outras dicas

Não chame wxYield a partir de um segmento de trabalho. Apenas fazer que a partir do thread de GUI. O rendimento irá processar eventos gui, e se destina a ser usado se em algum manipulador de eventos GUI você faz muito do trabalho e deseja atualizar outros controles e eventos pendentes do processo no meio. O Safe no meio wxSafeYield que desativa controles GUI antes de processar eventos pendentes em primeiro lugar. Isso irá protegê-lo de tais casos como entrar no manipulador de eventos que você chamou wxYield de uma segunda vez, de forma recursiva. Isso não significa que é thread-safe, ou algo parecido.

Se você quiser dar o resto da fatia de tempo seu segmento teria de outros tópicos, o chamado de wx wxThread::Yield ou aumento de this_thread::yield (dependendo da sua classe Thread) em vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top