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