Системне меню викликається по клацанню на іконці вікна або Alt + Space. Якщо ви напишете наступний код на створення вікна (подія OnCreate), то зможете самі в цьому переконатися. procedure TForm1.FormCreate (Sender: TObject);var hMenuHandle: HMENU; begin hMenuHandle: = GetSystemMenu (Handle, false); if hMenuHandle <> 0 then DeleteMenu (hMenuHandle, SC_CLOSE, MF_BYCOMMAND); end; Для зміни цього меню ми повинні використовувати API-функцію InsertMenu. Також нам знадобиться API-функція GetSystemMenu - вона повертає покажчик на системне меню.Ось конкретний приклад коду: menu: = GetSystemMenu (Handle, False); InsertMenu (menu, 5, MF_ByPosition, 1000, 'About'); Зрозуміло, змінна menu типу HMENU повинна бути до цього визначена. Код визначення: var menu: HMENU; Параметри у функції InsertMenu наступні: перший - це покажчик на системне меню. Його ми отримали через API-функцію GetSystemMenu. Другий - це номер позиції, на яку наш новий пункт меню вставиться (нумерація йде з нуля). Значення третього параметра (MF_ByPosition) говорить про те, що другий параметр інтерпретується саме як номер позиції для нового пункту меню. Четвертий - це ідентифікатор меню (ми задали для нього значення 1000). І, нарешті, п'ятий - це заголовок нового пункту меню.Оголошуємо змінну типу HMENU. Отримуємо дескриптор свого системного меню і поміщаємо його в змінну: Отримати дескриптор дозволяє функція GetSystemMenu (). Їй як параметр вказуємо ключове слово Handle - воно вказує, що буде отриманий дескриптор нашого системного меню. Другий параметр, що дорівнює false, означає, що повертається функцією значення буде не нульове, а рівне дескриптору меню вікна. Функція DeleteMenu дозволяє видалити пункт меню.
60. Поняття «потік» (потік виконання, thread). Навіщо аплікаціям потоки? Пріоритети потоків. Як операційна система керує потоками?
Для початку давайте визначимося, що під словом "потік" я маю на увазі саме Thread, який ще має назву "нитка". Нерідко зустрічав на форумах думки, що потоки не потрібні взагалі, будь-яку програму можна написати так, що вона буде чудово працювати і без них. А деякі завдання взагалі не можна реалізувати без використання потоків, наприклад робота з сокетами, COM-портом, тривале очікування будь-яких подій, і т.д. Всім відомо, що Windows система багатозадачна. Простіше кажучи, це означає, що кілька програм можуть працювати одночасно під управлінням ОС. Всі ми відкривали диспетчер задач і бачили список процесів. Процес - це екземпляр виконуваного застосування. Насправді сам по собі він нічого не виконує, він створюється під час запуску програми, містить в собі службову інформацію, через яку система з ним працює, так само йому виділяється необхідна пам'ять під код і дані. Для того, щоб програма запрацювала, в ньому створюється потік. Будь-який процес містить у собі хоча б один потік, і саме він відповідає за виконання коду і отримує на це процесорний час. Для створення додаткових потоків в Delphi існує базовий клас TThread, від нього ми й будемо успадковуватися при реалізації своїх потоків. Для того, щоб створити "кістяк" нового класу, можна вибрати в меню File - New - Thread Object, Delphi створить новий модуль із заготівлею цього класу. Як бачите, в цій заготівлі доданий один метод - Execute. Саме його нам і треба перевизначити, код всередині нього і буде працювати в окремому потоці. І так, спробуємо написати приклад - запустимо в потоці нескінченний цикл: TNewThread = class (TThread) private {Private declarations} protected procedure Execute; override; end;
var Form1: TForm1; implementation {$ R *. dfm} {TNewThread} procedure TNewThread.Execute; begin while true do {нічого не робимо}; end; procedure TForm1.Button1Click (Sender: TObject); var NewThread: TNewThread; begin NewThread: = TNewThread.Create (true); NewThread.FreeOnTerminate: = true; NewThread.Priority: = tpLower; NewThread.Resume; end;
Запустіть приклад на виконання і натисніть кнопку. Начебто нічого не відбувається - форма не зависла, реагує на переміщення. Насправді це не так - відкрийте диспетчер задач і ви побачите, що процесор завантажений по-повній. Зараз у процесі вашого застосування працює два потоки - один був створений спочатку, при запуску програми. Другий, який так вантажить процесор - ми створили після натискання кнопки.