> -- Илья Ермаков писал(а):
> Естественно - BeginOberonSafe ждет, пока главный цикл обработки сообщений будет в определенной точке, выполняет в этой точке блокировку главного потока среды. Затем мы выполняем действия из побочного потока, не боясь коллизий, и отпускаем главный поток среды "на все четыре стороны".BeginOberonSafe - это, так скажем, не "реального времени" вещь. Вся логика по изменению состояния отображения должна производиться отдельным потоком, который не завязан на GUI и никого не ждет, работает синхронно по времени, со Sleep. А периодический сигнал на обновление экрана лучше всего делать через Services.Action. Хотя можно и через специальный поток обновления с BeginOberonSafe. Пример такой графики (с летающими шариками и комнатами) есть в Active BlackBox. Хотя Вы правы - меню и т.п. также прерывает перерисовку. Можно разобраться и переделать политику обработки сообщений в HostWindows, но у меня сейчас времени на это нет... Кстати, допускаю, что это принципиальная особенность MDI-интерфейса в Винде.P.S. А использовать многопоточность в обычной версии ББ для работы нельзя, только поэкспериментировать/поиграться. Попробуйте в побочном потоке сделать активное выделение памяти и увидите мгновенную смерть среды...  Почему и был сделан Active BlackBox.

Так вот в очереди обработки сообщений и есть загвоздка. Ее и надо копать. Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.

По поводу MDI - нет это не особенность реализации этого интерфейса в  Винде, а именно особенности реализации очереди сообщений в Blackbox. В той же Delphi с MDI все работает на работает и не приостанавливается. А очередь сообщений получается краеугольным камнем всей среды. Если бы обработка сообщений была "правильной", то многопоточность пошла бы на ура, а так же Services.Action бы не останавливался, от  действий пользователя в меню.

Просто я как бы новичок в Blackbox, то и хотелось бы сократить время копания в исходниках и услышать идеи по этому поводу.

P.S. Если память выделять не в самом потоке, а в процедуре Method
типа:
ThreadMethod* = PROCEDURE;

PROCEDURE Synchronize*(Method: ThreadMethod);
VAR
r: WinApi.BOOL;
BEGIN
r := WinApi.SendMessageA(UtilWindow, WinApi.WM_NULL, 0, SYSTEM.ADR(Method));
END Synchronize;

UtilWindow- см. выше в примере с кубиком.
Ничего со средой не произойдет и можно подружить BlackBox с потоками