Послать сообщение на главную форму из потока (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);

И все получилось

→ Ссылка