Поставить графический элемент управления в другой поток? - PullRequest
2 голосов
/ 01 марта 2010

Я предполагаю, что это возможно, потому что такие программы, как Google Chrome, стали лучше и поместили каждую вкладку в отдельный процесс. Так как же я могу поместить элемент управления с графическим интерфейсом, такой как datagridview, в отдельный поток?

Ответы [ 3 ]

0 голосов
/ 25 мая 2010

Это не элемент управления, находящийся в отдельном потоке, а запрос, запущенный через элемент управления.

Допустим, у вас есть две вкладки, открытые по разным адресам. Вы нажимаете на ссылку, которая направляет вас на другой сайт на первой вкладке. Тем временем вы нажимаете другую ссылку на второй вкладке.

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

Во-вторых, теперь у нас есть один поток (основной поток, также называемый GUI-потоком), задача которого заключается в обработке взаимодействия с пользователем. Другой поток обрабатывает запрос по ссылке на первой вкладке, а другой поток - по ссылке на второй вкладке.

В-третьих, пока обрабатываются ваши запросы на ссылки для обеих вкладок, вы можете, скажем, открыть новую вкладку и выполнить поиск в Google! Затем для этого требуется, чтобы ваш графический интерфейс реагировал, даже когда приложение, браузер, занято вашими запросами.

В-четвертых, по возвращении фоновых потоков они возвращаются в основной поток, сообщая о результате своей работы, то есть полученный ими веб-ответ с запросом на решение DNS связывал ссылки, по которым щелкнули.

Интересный способ сделать это возможным в C # и сделать его максимально простым - это класс BackgroundWorker.

Каждый экземпляр BackgroundWorker представляет поток. Таким образом, вам нужно создать столько экземпляров BackgroundWorker, сколько требуется приложению при захвате щелчка мыши, когда пользователь нажимает на ссылку. Затем запрос отправляется на событие DoWork(), которое вызывается при вызове метода RunWorkerAsync().

Вот интересный урок о том, как использовать BackgroundWorker

0 голосов
/ 06 марта 2012

Эта статья Microsoft примерно объясняет, как Windows Explorer делает именно то, что вы просите:

http://msdn.microsoft.com/en-us/library/ms741870.aspx#multi_browser

У вас в основном один поток на окно верхнего уровня, и все события для этого окна запускаются в одном потоке.

0 голосов
/ 01 марта 2010

Я не думаю, что вам понадобится Thread для каждого отдельного элемента управления, иначе у вас будет огромное количество потоков, и тогда вы можете столкнуться с различными проблемами.

Вот пара сайтов, с которых можно начать: http://www.albahari.com/threading/

http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx

...