На базарной площади довольно часто можно слышать высказывания об
Обероне. Мне кажется, что на базарной площади пора появиться ветке об
этой системе и языке, что-то вроде "Мысли об Обероне". Что это такое, перспективы
этой системы, что
полезного можно извлечь из него для программирования на Дельфи
(например) и др.
Вопрос на тему реализации многопоточности. Есть следующий модуль:
MODULE Test4;
IMPORT WinApi, SYSTEM, Log:=StdLog;
CONST
MAX_TIMES = 1000;
VAR
HANDLE: ARRAY 2 OF WinApi.HANDLE;
IpCriticalSection: WinApi.RTL_CRITICAL_SECTION;
IpThreadId: ARRAY 2 OF INTEGER;
g_nIndex, a, a1, a2: INTEGER;
g_dwTimes: ARRAY MAX_TIMES OF INTEGER;
PROCEDURE FirstThread(IpParameter: WinApi.PtrVoid): INTEGER;
VAR fDone: BOOLEAN;
BEGIN
Log.String('FirstThread'); Log.Ln;
fDone:=FALSE;
WHILE ~fDone DO
WinApi.EnterCriticalSection(IpCriticalSection);
IF g_nIndex >= MAX_TIMES THEN
fDone:=TRUE;
ELSE g_dwTimes[g_nIndex]:=WinApi.GetTickCount();
Log.Int(g_dwTimes[g_nIndex]); Log.Ln;
INC(g_nIndex);
END;
WinApi.LeaveCriticalSection(IpCriticalSection);
END;
RETURN 0;
END FirstThread;
PROCEDURE SecondThread(IpParameter: WinApi.PtrVoid): INTEGER;
VAR fDone: BOOLEAN;
BEGIN
Log.String('SecondThread'); Log.Ln;
fDone:=FALSE;
WHILE ~fDone DO
WinApi.EnterCriticalSection(IpCriticalSection);
IF g_nIndex >= MAX_TIMES THEN
fDone:=TRUE;
ELSE INC(g_nIndex);
g_dwTimes[g_nIndex-1]:=WinApi.GetTickCount();
Log.Int(g_dwTimes[g_nIndex-1]); Log.Ln;
END;
WinApi.LeaveCriticalSection(IpCriticalSection);
END;
RETURN 0;
END SecondThread;
PROCEDURE Main*;
BEGIN
WinApi.InitializeCriticalSection(IpCriticalSection);
Log.String('Main'); Log.Ln;
HANDLE[0]:=WinApi.CreateThread(NIL, 0, FirstThread, 0, {}, IpThreadId[0]);
Log.String('Tread1'); Log.Ln;
HANDLE[1]:=WinApi.CreateThread(NIL, 0, SecondThread, 0, {}, IpThreadId[1]);
a:=WinApi.WaitForMultipleObjects(2, HANDLE[0], 1, WinApi.INFINITE);
a:=WinApi.WaitForMultipleObjects(2, HANDLE[1], 1, WinApi.INFINITE);
a1:=WinApi.CloseHandle(HANDLE[0]);
a2:=WinApi.CloseHandle(HANDLE[1]);
WinApi.DeleteCriticalSection(IpCriticalSection);
END Main;
END Test4.
В результате его запуска ЧЯ аварийно завершает работу. В чем причина?
Здесь не все ясно с вызовом процедуры
a:=WinApi.WaitForMultipleObjects(2, HANDLE[0], 1, WinApi.INFINITE);
a:=WinApi.WaitForMultipleObjects(2, HANDLE[1], 1, WinApi.INFINITE);
потому как в примере на С второй параметр - указатель на массив HANDLE, а не отлельный элемент. Сделать указатель что-то не получается. Может встречались с такими проблемами? Прошу оказать помощь.
P.S. Программа должна выводить массив чисел в возрасатющей последовательности. Что тоже делает с ошибками.