Теперь, если понять ваш вопрос иначе...

Начнем с того, что Блэкбокс не завис, а продолжает выполнять ваше задание.
Но 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