Должна ли каждая форма VCL иметь свой собственный цикл сообщений / насос для потоков? - PullRequest
2 голосов
/ 12 марта 2011

Я пытаюсь реализовать шаблон MVP в моем последнем проекте.В настоящее время я использую библиотеку VCL, которая поставляется с C ++ Builder 2007. Я думаю, мне не нужно делать Application-> Run () или, что еще хуже, Application-> CreateForm (), которая создает основную форму и цикл в этой форме.Я не хочу основную форму, вместо этого я хочу основной Presenter .

Тогда возникает вопрос, как создать многопоточные TForms?

Вариант 1: Если существует только один цикл сообщений (докладчик), то каждый случайный поток в моей системе должен будет отправить сообщение в этот основной поток и создать формы.

Вариант 2: Каждая форма имеет свой собственный цикл сообщений.Теперь случайные темы могут создавать новые и удалять их по мере необходимости.Отправка сообщений по-прежнему используется для связи между ними.

Если рекомендуется вариант 2, есть ли у кого-нибудь какие-либо рекомендации по реализации этого подхода?

РЕДАКТИРОВАТЬ: Как я могу изменитьчтобы разрешить создание формы с помощью new и все еще позволить циклу работать?

// Start VCL library
pApplication->Initialize();

// Create the Main form and assign the MainForm property
pApplication->CreateForm(__classid(TForm1), &pFormMain);

// Show the form
pFormMain->Show();

// Run the loop
pApplication->Run();

Ответы [ 2 ]

3 голосов
/ 12 марта 2011

Вы не помещаете каждую форму в отдельную ветку.Вы помещаете каждую форму в основной поток.

В потоке есть только один цикл сообщений.Исключением является специальный цикл сообщений, который запускается, когда форма отображается модально.

pApplication->Run(); запускает цикл сообщений.Когда обработанные сообщения обрабатываются, они отправляются в соответствующую оконную процедуру.Когда сообщения отправляются, они доставляются синхронно прямо в оконную процедуру.

Вы можете создавать и отображать столько форм, сколько хотите, и обслуживать их все из одной и той же петли сообщений.Мало того, что вы можете сделать это, это способ сделать что-то.

Другое дело, как вы отображаете эти знания в своей инфраструктуре MVP, но запуск графического интерфейса из одного потокафиксированная точка в любом решении.

РЕДАКТИРОВАТЬ

Вы спрашиваете, как с помощью VCL запустить цикл сообщений, если у вас нет видимой главной формы.У вас есть два варианта:

  1. Создать невидимую форму, прежде чем позвонить pApplication->Run();.
  2. Запустить свой собственный цикл сообщений.

В моем представлении вариант1, безусловно, лучший вариант.

1 голос
/ 12 марта 2011

Вы не можете безопасно создавать многопоточные формы, используя VCL, потому что VCL не является поточно-ориентированным.

Кроме того, каждая форма уже содержит свой собственный цикл сообщений. TApplication просто отправляет сообщения в цикл каждой формы.

...