Теперь, если понять ваш вопрос иначе... 
Начнем с того, что Блэкбокс не завис, а продолжает выполнять ваше задание.
Но Windows думает, что он завис, поэтому показывает вам сообщение.
Он так думает, потому что Блэкбокс перестал отвечать на системные сообщения.
Чтобы ББ отвечал на них, и иногда обновлял интерфейс, надо в ваш цикл вставить вызов вот такой процедуры:
Код:
   PROCEDURE ProcessMessages;
      VAR msg: Win.MSG; res: INTEGER;
   BEGIN
      WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
         res := Win.TranslateMessage(msg); res := Win.DispatchMessageA(msg)
   END END ProcessMessages;
Спасибо 
Штирлицу, что когда-то показал мне такое решение: 
viewtopic.php?f=31&t=1937&p=39240#p39240Получится вот такой код:
Код:
MODULE Fibonacci;
IMPORT StdLog, Win := WinApi;
PROCEDURE ProcessMessages;
   VAR msg: Win.MSG; res: INTEGER;
BEGIN
   WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
      res := Win.TranslateMessage(msg); res := Win.DispatchMessageA(msg)
END END ProcessMessages;
PROCEDURE Do*;
VAR
   a, b, c, i, n: INTEGER;
BEGIN
   a := 0;
   b := 1;
   n := 900000;
   FOR i := 0 TO n DO
      c := b;
      b := a + b;
      a := c;
      StdLog.Int( c );
      IF i MOD 10000 = 0 THEN
         ProcessMessages
      END
   END;
END Do;
END Fibonacci.
Однако более правильное решение часто - это разбить вычисления на порции и организовать в очередь рекурсивно устанавливающихся событий.
Этот вопрос обсуждался тут: 
viewtopic.php?f=1&t=130