> -- Пётр Кушнир писал(а):
> Такой вопрос, а вы используете подсистему Comm для работы с сетью? Насколько я знаю, она изначально неблокирующая.

Я использовал модуль CommTCPAsync с сайта:http://www.zinnamturm.eu/downloadsDH.htm#Dbu
Хотя этот модуль решает проблему блокировки функций, при создании подключения, функция GetFile из этого модуля блокирует работу среды до полного скачивания файла. Но там же в комментариях сказано, что это легко переделать на неблокирующую работу, что я и сделал.

Насчет вашего решения, в принципе оно похоже на первое решение, которое я привёл. Я знаю, что так можно сделать. Но почему-то мне такое решение кажется некрасивым, так как вместо простого циклического подхода используется рекурсивный подход.

Я почитал форум, понял что, вопрос, который я задал, лучше было бы задать в секции: "Параллельное и многопоточное программирование". Понял что тема параллельного программирования достаточно сложна, но тем не менее прочитанное натолкнуло меня на еще одно решение. Здесь приведен простенький модуль, который должен сначала распечатать цифры от 0 до 4 с интервалом в одну секунду, после чего распечатать прочерки. Суть решения в вызове Services.actionHook.Step в цикле, что как я думаю и является аналогом функции Wait о которой я спрашивал.

MODULE MyAsyncModule;

IMPORT Log, Services;

TYPE
Async = POINTER TO RECORD (Services.Action)
counter: INTEGER;
END;

VAR
b: BOOLEAN;

PROCEDURE (a: Async) Do-;
BEGIN
IF a.counter < 5 THEN
Log.Int(a.counter); Log.Ln;
INC(a.counter);
Services.DoLater(a, Services.Ticks()+Services.resolution);
ELSE
b := TRUE;
END;
END Do;

PROCEDURE Start*;
VAR a: Async;
BEGIN
b := FALSE;
NEW(a);
a.counter := 0;
Services.DoLater(a, Services.Ticks()+Services.resolution);
WHILE ~b DO
Services.actionHook.Step;
END;
Log.String("-------------------------"); Log.Ln;
END Start;

END MyAsyncModule.

Насколько правильно/неправильно данное решение? Какие могут быть минусы?