Послать сообщение на главную форму из потока (MsgWaitForMultipleObjects)
У меня из главного потока (GUI)запускаются несколько потоков на скачивание файлов. Во время скачивания мне нужно посылать WM сообщение на главное окно, для того чтобы заполнить Memo. Т.е каждый поток шлет информацию о там какой файл он скачал. Но у меня почему-то MsgWaitForMultipleObjects завершается только тогда когда все потоки отработают. И во время скачивания сообщения не обрабатываются. Соответственно записи в Memo появляются только после завершения ожидания всех потоков.
Код ожидания завершения всех потоков
var
zEventFinished: array of THandle;
...
SetLength(zEventFinished, 8);
for i := 0 to Length(zEventFinished) - 1 do
zEventFinished[i] := CreateEvent(nil, False, False, nil);
...
while (True) do
begin
zWaitResult:= MsgWaitForMultipleObjects(8, Pointer(zEventFinished[0]), true, INFINITE, QS_ALLINPUT);
case zWaitResult of
WAIT_OBJECT_0: break;
WAIT_OBJECT_0+8:
begin
while (PeekMessage(zMsg, 0, 0, 0, PM_REMOVE)) do
begin
TranslateMessage(zMsg);
DispatchMessage(zMsg);
end;
end
else
break;
end;
end;
Код отправки сообщения из потока
while I < FFileListName.Count do
begin
....
PostMessage(FMainWindow, WM_Show_Download,
integer(TDownLoadInfo.Create('Download to ' + FParam.Items['Path'] +
'\' +
FFileListName.Strings[J])), 0);
....
end;
Обработчик сообщения на главном окне
procedure TMainWindow.WM_ShowDownload(var Message: TMessage);
var
zInfo: TDownLoaadInfo;
begin
zInfo := TDownLoaadInfo(Message.WParam);
Memo1.Lines.Add(zInfo.Msg);
zInfo.Free;
end;
Ответы (1 шт):
Автор решения: gregor
→ Ссылка
Исправил на
zWaitResult:= MsgWaitForMultipleObjectsEx(1, zEventFinished[0], INFINITE, QS_ALLINPUT, 0);
И все получилось