А почему не
PostThreadMessage?
- Код: Выделить всё
program ThreadMessage;
uses
Windows, Classes;
const
// Определение константы для пользовательского сообщения
Msg_createFILES = WM_USER + 1;
var
// Глобальная переменная для хранения идентификатора основного потока
MainThreadId: DWORD;
// Процедура для обработки сообщений в основном потоке
procedure HandleMessage;
var
Msg: TMsg;
begin
// Проверка наличия сообщений в очереди сообщений
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
// Обработка пользовательского сообщения Msg_createFILES
if Msg.message = Msg_createFILES then
begin
WriteLn('Received message in main thread: ', Msg.wParam);
end;
// Обработка других сообщений
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
// Определение подкласса TThread для выполнения кода во вспомогательном потоке
type
TMyThread = class(TThread)
protected
// Переопределение метода Execute для выполнения кода во вспомогательном потоке
procedure Execute; override;
end;
// Реализация метода Execute для отправки сообщения из вспомогательного потока в основной
procedure TMyThread.Execute;
begin
WriteLn('Sending message from secondary thread');
PostThreadMessage(MainThreadId, Msg_createFILES, 2, 0);
end;
begin
// Получение идентификатора основного потока
MainThreadId := GetCurrentThreadId;
// Создание и запуск вспомогательного потока с помощью класса TMyThread
with TMyThread.Create(True) do
begin
FreeOnTerminate := True;
Start;
end;
// Бесконечный цикл для обработки сообщений в основном потоке
while True do
HandleMessage;
end.
Создается константа `Msg_createFILES` для определения пользовательского сообщения. Затем определяется глобальная переменная `MainThreadId` для хранения идентификатора основного потока. Процедура `HandleMessage` используется для обработки сообщений в основном потоке. Она проверяет наличие сообщений в очереди сообщений с помощью функции `PeekMessage` и обрабатывает пользовательское сообщение `Msg_createFILES`, выводя соответствующее сообщение в консоль.
Далее определяется подкласс `TMyThread` класса `TThread` для выполнения кода во вспомогательном потоке. Метод `Execute` этого класса переопределяется для отправки сообщения из вспомогательного потока в основной с помощью функции `PostThreadMessage`.
В главной части программы получается идентификатор основного потока с помощью функции `GetCurrentThreadId`. Затем создается экземпляр класса `TMyThread` и запускается с помощью свойства `Start`. В бесконечном цикле вызывается процедура `HandleMessage` для обработки сообщений в основном потоке.