Как создать многопоточные формы как MDIChild

Можно ли иметь несколько многопоточных форм как MDIChild? У меня есть элемент управления ActiveX в форме MdiChild, который может занимать много ресурсов процессора, и хотел бы, чтобы один элемент управления не влиял на другой элемент управления, используя приведенный ниже пример кода. Но строка frmDoc.MdiParent = Me выдает исключение кросс-потоков.

Dim frmDoc As MDIChild
Dim newThread As New Thread(
    Sub()
        frmDoc = New MDIChild
        frmDoc.MdiParent = Me '<- this line throws cross threading exception.
        Application.Run(frmDoc)
    End Sub
)
newThread.IsBackground = True
newThread.SetApartmentState(ApartmentState.STA)
newThread.Start()

Выдает исключение System.InvalidOperationException:

Message=Cross-thread operation not valid: 
  Control 'FormMdiApp' accessed from a thread other than the thread it was created on.
Source=System.Windows.Forms
 Blorgbeard20 сент. 2012 г., 23:26
Я не знаю о C ++ MFC, но если вы просто изменитеfrmDoc для дочерней формы без MDI, это должно работать. Вы должны быть осторожны сInvoke конечно, в любое время вам нужно получить к нему доступ из другого потока.
 Nikola Radosavljević29 сент. 2012 г., 20:59
Показать дополнительную информацию об "исключении из потоков".
 walter20 сент. 2012 г., 22:06
Подумав только, возможно ли это сделать в приложении C ++ MFC?
 Blorgbeard20 сент. 2012 г., 06:16
Можно ли сделать эту форму с помощью элемента управления ActiveX не-MDI?
 walter23 сент. 2012 г., 08:33
Я думаю, что мой единственный вариант - следовать примеру MTMDI: демонстрирует поток пользовательского интерфейса MFC & quot;msdn.microsoft.com/en-us/library/s3wsyb55%28VS.80%29.aspx

Ответы на вопрос(3)

попробуйте BackgroundWorkerhttp://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.95).aspx

Выполните всю сложную операцию в событии DoWork и используйте событие ProgressChanged / RunWorkerCompleted для обновления элементов пользовательского интерфейса.

Доступные варианты как это реализовать

Switch to VC++ MFC framework and follow MTMDI Sample: Demonstrates an MFC User Interface Thread

As it was suggested by @Blorgbeard replace MdiChild with Forms

Look at Running a WPF control in another thread

Только что нашел хорошую статью поддержки MSDNКак создать Windows в многопоточном приложении

Creating a window can force an implicit AttachThreadInput(), when a parent window is created in one thread and the child window is being created in another thread. When windows are created (or set) in separate threads with a parent-child relationship, the input queues are attached.

Более подробную информацию можно найти на Пошаговое руководство. Поддержка взаимодействия с COM путем отображения каждой формы Windows в отдельном потоке

Аналогичный вопрос был заданСоздайте новый поток, чтобы открыть новое окно и закрыть его из другого потока.

Но, к счастью, никто из них не имеет ничего общего с детскими формами.

Обновление: только что нашли ошибки в коде Walkthrough; но в целом этот образец имеет несколько хороших идей.

Элементы GUI должны быть инициализированы и доступны только в основном цикле событий. Вы можете обрабатывать тяжелые вычисления асинхронно или в фоновых потоках.

 20 сент. 2012 г., 18:02
@Blorgbeard, это разумно сделать? Я никогда не сталкивался с несколькими формами в нескольких потоках. Можете ли вы показать примеры? Благодарю.
 walter30 сент. 2012 г., 02:53
Например, Google Chrome запускает каждую вкладку в отдельном процессе.
 23 сент. 2012 г., 22:55
Да, это возможно. По сути, вы делаете то, что делает OP, за исключением форм MDI. В новом потоке (STA) вы создаете форму, а затем передаете ее в Application.Run, который настраивает для вас новый цикл обработки событий. Вы должны быть осторожны, чтобы вызывать любые вызовы между потоками, но это работает.
 20 сент. 2012 г., 06:13
Можно иметь несколько форм, каждая из которых имеет свой собственный поток и цикл обработки сообщений, но я не думаю, что он будет работать с детьми MDI.
 30 сент. 2012 г., 04:41
@walter: Google Chrome также не работает на WinForms.

Ваш ответ на вопрос