diff --git a/programs/develop/fp/examples/example.pp b/programs/develop/fp/examples/example.pp index f05c97a9b2..6bcd2f73e5 100644 --- a/programs/develop/fp/examples/example.pp +++ b/programs/develop/fp/examples/example.pp @@ -1,10 +1,13 @@ -{$codepage cp866} + +{ В FreePascal 2.2.0 кодировка cp866 не реализована. } +{-$codepage cp866} + {$mode objfpc} {$smartlink on} {$apptype console} { На данный момент рассматривается выполнение прилодения только как консольное, - т.е. директива concole обязательна, поведение программы при отсутствии этой + т.е. директива console обязательна, поведение программы при отсутствии этой директивы предопределить нельзя. Гарантированно нельзя использовать функции Write, WriteLn, Read, ReadLn относительно стандартной консоли ввода/вывода. } @@ -21,13 +24,13 @@ procedure DoPaint; { Вывод содержимого окна приложения } begin kos_begindraw(); - {определение параметров окна (0)} + {определение параметров окна} kos_definewindow(200, 200, 200, 50, $23AABBCC); {kos_definewindow не имеет параметра для вывода заголовка, - делаем это отдельной функцией} - {kos_setcaption, отображение заголовка окна (71.1)} + делаем это отдельной функцией kos_setcaption} + {отображение заголовка окна} kos_setcaption('ПРИМЕР ПРОГРАММЫ'); - {вывод сообщения (4)} + {вывод сообщения} kos_drawtext(3, 8, 'Нажмите любую клавишу...'); kos_enddraw(); end; @@ -44,7 +47,7 @@ begin Notes[1] := Key shr 8; Notes[2] := $00; {воспроизводим} - kos_speak(@Notes); + kos_speaker(@Notes); end; @@ -53,27 +56,29 @@ function DoButton: Boolean; var Button: DWord; begin - {получить код нажатой клиыиши} + {получить код нажатой кливиши} Button := kos_getbutton(); - {если X, то завершение приложения} - Result := Button = 1; + {если [x], то вернуть ложь, а значит спровоцировать закрытие приложения} + Result := Button <> 1; end; function ProcessMessage: Boolean; -{ @return: Возвращает False, если было событие к завершению приложения. +{ Ожидание и обработка событий. + + @return: Возвращает False, если было событие к завершению приложения. @rtype: True или False } var Event: DWord; begin - Result := False; + Result := True; {ожидаем события от системы} Event := kos_getevent(); case Event of SE_PAINT : DoPaint; {перерисовка окна} SE_KEYBOARD: DoKey; {событие от клавиатуры} SE_BUTTON : Result := DoButton; {собыие от кнопки, может определить - завершение приложения, если вернет True} + завершение приложения, если вернет False} end; end; @@ -83,17 +88,14 @@ procedure MainLoop; var ThreadSlot: TThreadSlot; begin - {сделать это окно активным} - ThreadSlot := kos_getthreadslot(ThreadID); - kos_setactivewindow(ThreadSlot); {настраиваем события, которые мы готовы обрабатывать} kos_maskevents(ME_PAINT or ME_KEYBOARD or ME_BUTTON); - {главный цикл} - while not ProcessMessage do; + {обработка событий} + while ProcessMessage do; end; begin - WriteLn('Look for a new window, I''m just a konsole, hi mike ;-)'); + WriteLn('Look for a new window, I''m just a konsole ;-)'); MainLoop; end. diff --git a/programs/develop/fp/readme-ru.txt b/programs/develop/fp/readme-ru.txt index 6d5017c0db..4e84be8861 100644 --- a/programs/develop/fp/readme-ru.txt +++ b/programs/develop/fp/readme-ru.txt @@ -1,7 +1,7 @@ Codepage: cp866 -Текущий код адаптирован и проверялся только на FreePascal 2.3.1 (SVN 8373) при -компиляции из Windows. +Текущий код адаптирован и проверялся только на FreePascal 2.2.0 при компиляции +из Windows. Для компилирования версии RTL для KolibriOS вам необходимо иметь установленный у себя FreePascal с исходными кодами RTL указанной выше версии. Откройте файл diff --git a/programs/develop/fp/rtl/_defines.inc b/programs/develop/fp/rtl/_defines.inc index 8fe7b9a3da..3ef21aec93 100644 --- a/programs/develop/fp/rtl/_defines.inc +++ b/programs/develop/fp/rtl/_defines.inc @@ -5,5 +5,7 @@ {$undef os2} {$undef linux} -{$define EMULATOR} +{$undef DISABLE_NO_THREAD_MANAGER} {$undef debug_mt} + +{$define EMULATOR} diff --git a/programs/develop/fp/rtl/kos.inc b/programs/develop/fp/rtl/kos.inc index cdddfd1b39..e1f2d614ea 100644 --- a/programs/develop/fp/rtl/kos.inc +++ b/programs/develop/fp/rtl/kos.inc @@ -594,7 +594,7 @@ end; { Sound } -function kos_speak(notes: Pointer): Boolean; assembler; register; +function kos_speaker(notes: Pointer): Boolean; assembler; register; asm pushl %esi pushl %ebx diff --git a/programs/develop/fp/rtl/kos_stdio.inc b/programs/develop/fp/rtl/kos_stdio.inc index 16165b09a0..68070a4fc0 100644 --- a/programs/develop/fp/rtl/kos_stdio.inc +++ b/programs/develop/fp/rtl/kos_stdio.inc @@ -151,6 +151,7 @@ begin FThreadID := BeginThread(TThreadFunc(@KonsoleThreadMain), @Self); if FThreadID <> 0 then {XXX: может зависнуть} + {Во, так и есть в 2.2.0.} while not FOpened do ThreadSwitch; end; diff --git a/programs/develop/fp/rtl/kosh.inc b/programs/develop/fp/rtl/kosh.inc index ed01831761..8d35d60f63 100644 --- a/programs/develop/fp/rtl/kosh.inc +++ b/programs/develop/fp/rtl/kosh.inc @@ -142,7 +142,7 @@ function kos_fileinfo(kosfile: PKosFile): DWord; { Sound } -function kos_speak(notes: Pointer): Boolean; +function kos_speaker(notes: Pointer): Boolean; { Work with hardware } function kos_readport(index: DWord): DWord; diff --git a/programs/develop/fp/rtl/systhrd.inc b/programs/develop/fp/rtl/systhrd.inc index 34915aff0b..fbb8867087 100644 --- a/programs/develop/fp/rtl/systhrd.inc +++ b/programs/develop/fp/rtl/systhrd.inc @@ -185,7 +185,7 @@ begin if not IsMultiThread then begin TLSKey := TLSAlloc(); - InitThreadVars(@SysRelocateThreadVar); {XXX: must be @SysRelocateThreadvar} + InitThreadVars(@SysRelocateThreadVar); IsMultiThread := True; end; @@ -287,6 +287,51 @@ begin end; +{***************************************************************************** + Heap Mutex Protection +*****************************************************************************} + +{$ifndef HAS_MT_MEMORYMANAGER} +var + HeapMutex: TRTLCriticalSection; + +procedure KosHeapMutexInit; +begin + InitCriticalSection(HeapMutex); +end; + +procedure KosHeapMutexDone; +begin + DoneCriticalSection(HeapMutex); +end; + +procedure KosHeapMutexLock; +begin + EnterCriticalSection(HeapMutex); +end; + +procedure KosHeapMutexUnlock; +begin + LeaveCriticalSection(HeapMutex); +end; + + +const + KosMemoryMutexManager: TMemoryMutexManager = ( + MutexInit : @KosHeapMutexInit; + MutexDone : @KosHeapMutexDone; + MutexLock : @KosHeapMutexLock; + MutexUnlock: @KosHeapMutexUnlock); + + +procedure InitHeapMutexes; +begin + SetMemoryMutexManager(KosMemoryMutexManager); +end; + +{$endif HAS_MT_MEMORYMANAGER} + + var KosThreadManager: TThreadManager; @@ -336,5 +381,8 @@ begin SemaphorePost := @NoSemaphorePost; end; SetThreadManager(KosThreadManager); +{$ifndef HAS_MT_MEMORYMANAGER} + InitHeapMutexes; +{$endif HAS_MT_MEMORYMANAGER} ThreadID := GetCurrentThreadID; end; diff --git a/programs/develop/fp/rtl/sysutils.pp b/programs/develop/fp/rtl/sysutils.pp index c93aba1df8..4eea758eae 100644 --- a/programs/develop/fp/rtl/sysutils.pp +++ b/programs/develop/fp/rtl/sysutils.pp @@ -161,7 +161,7 @@ begin ReleaseFileRecord(Handle); end; -function FileTruncate(Handle: THandle; Size: Int64): Boolean; +function FileTruncate(Handle: THandle; Size: Longint): Boolean; begin Result := False; end;