У меня есть простая программа Delphi, над которой я работаю, в которой я пытаюсь использовать многопоточность, чтобы отделить функциональность программы от ее графического интерфейса и сохранить отклик графического интерфейса во время более длительных задач и т. д. По сути, у меня есть «контроллер» TThread и «представление» TForm. Представление знает дескриптор контроллера, который он использует для отправки сообщений контроллера через PostThreadMessage
. В прошлом у меня не было проблем с использованием такой модели для форм, которые не являются основной формой, но по какой-то причине, когда я пытаюсь использовать эту модель для основной формы, цикл сообщений потока просто завершается.
Вот мой код для цикла сообщений потоков:
procedure TController.Execute;
var
Msg : TMsg;
begin
while not Terminated do begin
if (Integer(GetMessage(Msg, hwnd(0), 0, 0)) = -1) then begin
Synchronize(Terminate);
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
case Msg.message of
// ...call different methods based on message
end;
end;
end;
Чтобы настроить контроллер, я делаю это:
Controller := TController.Create(true); // Create suspended
Controller.FreeOnTerminate := True;
Controller.Resume;
Для обработки сообщений основной формы я пробовал использовать как Application.Run
, так и следующий цикл (сразу после Controller.Resume
)
while not Application.Terminated do begin
Application.ProcessMessages;
end;
Я застрял здесь - любая помощь будет принята с благодарностью.
begin
в той же строке, что иdo
илиthen
перед ним. Это считается хорошим стилем в C, но в Delphi большинство из нас предпочитает помещать его в отдельную строку, чтобы мы могли визуально выстроить парыbegin
иend
. - person Mason Wheeler   schedule 23.03.2010TController.Execute
, как только я перешагиваю черезGetMessage
, независимо от того, что я передаю как hwnd, цикл просто не проходит. Он не выполняет никаких операторов после цикла, он просто необъяснимо останавливается. И что еще больше сбивает с толку, так это то, что я не вижу признаков того, что сам поток действительно умер. - person Erik Westenbroek   schedule 23.03.2010Synchronise()
? Если цикл обработки сообщений не запущен, он может просто выйти из строя. Кроме того, какую версию Delphi вы используете? - person Nat   schedule 23.03.2010begin
в отдельной строке — это визуальный шум. Один только отступ говорит все, что нужно. Спрячьте шум в конце строки, чтобы он не мешал. - person Rob Kennedy   schedule 23.03.2010