LINUX.ORG.RU

Xlib - проблема с сообщениями


0

0

Весь день уже в гугле сижу...
В общем проблема вот какая:

Есть окно, основной поток А, в котором выполняется XtMainLoop, и он не доступен.

Надо передать сообщение из потока Б для окна, так чтобы он его получил и обработал в своем потоке (А). Для примера гоняю Expose.
В потоке А подписываюсь:

long evmask = ExposureMask;
XtAddEventHandler(wgt, evmask, false, X11EventProc, this);

В потоке Б запускаю процедуру:

while (mRun)
{
XExposeEvent xevent;
xevent.type = Expose;
xevent.send_event = false;
xevent.display = mDisplay;
XSendEvent(mDisplay, mWindow, false, ExposureMask, (XEvent*)&xevent);
XSync(mDisplay, true);
// sleep, etc
}

Expose приходит только 1 раз - когда действительно надо перерисовать. В остальном - тупой игнор, сообщения отправляются, но не приходят в обработчик (который по идее настроен правильно, т.к. первый эвент от X11 приходит). Начинал вообще с ClientMessage - то же самое. Потом где-то в гуглокнигах прочитал что ClientMessage не нужна маска, и он может не выбираться из XtMainLoop. Почему не доходят сообщения?

Общая задача - заставить из другого потока перерисовать окно (т.е. должно быть событие). В винде это делается с пом. Invalidate... Блин, неужели нельзя было сделать элементарный таймер в X11 (по типу win32 WM_TIMER)?

★★

сам не пробывал, но слышал от приятеля маты на то что оно не поддерживает многопоточность и как это плохо

xtron
()
Ответ на: комментарий от xtron

да... хотя для меня осталось загадкой - почему? ведь если все сообщения проходят через сокеты - то они потокобезопасны чуть более чем полностью... В который раз убеждаюсь что Х - закаменелое говно мамонта которое надо просто выбросить.

XInitThreads пользую. Один дядя на убунтофорумах советовал для каждого потока держать свой дисплей. Тоже пробовал. Без результатов. Документации - как кот наплакал.

k0l0b0k ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.