Falhar com boost :: fio
-
20-08-2019 - |
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
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.