我有(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;
更正为
一切都解决了