Я всегда показывал такие вещи в основном потоке и использовал события, чтобы синхронизировать конец окна с потоком, чтобы сообщить ему, когда окна закрыты.Должен ли я не показывать форму или сообщение из потока?
Сегодня во время разработки я хотел переместить отображаемую форму из потока в основной пользовательский интерфейс, но он был успешно отображен. Единственное, что я добавил, что в основном потоке Я толкаю ожидания сообщений о событии:
procedure WaitWithMessageLoop();
var
vWaitForEventHandles:array[0..1] of THandle;
vWaitForResponse:DWORD;
Msg: TMSG;
begin
vWaitForEventHandles[0] := LServiceMonitor.Handle;
while (1=1) do
begin
vWaitForResponse := MsgWaitForMultipleObjects(1, vWaitForEventHandles, FALSE, INFINITE, QS_ALLINPUT);
if (vWaitForResponse = WAIT_OBJECT_0 + 1) then
begin
while (PeekMessage(msg,0,0,0,PM_REMOVE)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
else
if (vWaitForResponse = WAIT_FAILED)
then RaiseLastOSError
else break;
end;
end;
Так что мой вопрос. Является ли такой scenerio приемлемым? Или мне нужно переместить форму для отображения в основном потоке?
Благодаря
Вы не дали понять, насколько все это подходит. Где находится форма, которую вы показываете? –
В настоящее время эта форма создается и отображается в виде нити. Событие, которое я жду (как указано выше), просто дает мне информацию, когда эта нить завершит свою работу. (Он также выводит сообщения для отображения сообщений, отправляемых из потока) – John
Вы не можете надежно запускать формы VCL вне основного потока графического интерфейса. Даже не думай об этом. Запустите форму из основного потока графического интерфейса, как вы знаете, что вы должны делать. Я предполагаю, что код в вопросе работает в потоке? 'while 1 = 1' лучше написано' while True'. Почему цикл не прерывается, когда ожидание возвращается успешно. 'WAIT_FAILED' является критерием нечетного завершения. –