2010-03-01 9 views
3

Je suppose qu'il est possible de le faire car des programmes comme google chrome ont été améliorés et ont placé chaque onglet dans un processus séparé. Alors, comment puis-je mettre un contrôle GUI tel que datagridview sur un thread séparé?Mettez un contrôle GUI sur un thread différent?

Répondre

0

Je crois que n'est pas possible ... Pour modifier une commande (par exemple en ajoutant un enfant à elle.) , vous devez être sur le même thread qui a créé le parent. Par conséquent, votre contrôle enfant devrait être créé par le même thread qui a créé son parent.

Les éléments que je me souviens avoir vu créé sur différents threads sont dialogues permanents et autres, mais cela n'est possible parce que les dialogues permanents sont de nouvelles fenêtres/formes. Google Chrome peut avoir chaque onglet s'exécutant dans un processus différent, mais cela ne signifie pas que les éléments d'interface utilisateur réels représentant les onglets n'ont pas été marshalés sur le thread UI principal (celui qui a créé la fenêtre contenant le navigateur) pour l'affichage .

Maintenant, bien sûr, vous êtes toujours en mesure d'effectuer le travail de chargement des données pour vos grilles sur un thread séparé, et les liens de Ardman vous y aidera. Lorsque vous liez réellement vos données aux grilles, vous devrez le faire sur le thread d'interface utilisateur (ou plus précisément, le thread qui a créé le contrôle que vous modifiez).

Espérons que cela aide!

+0

CreateWindow n'exige pas que le parent appartienne au même thread. C'est donc juste une autre fonctionnalité de Windows que .NET ne supporte pas. –

+1

J'ai mentionné que vous pouviez en effet créer de nouvelles fenêtres/formulaires sur différents sujets ... Ai-je mal compris ce que vous dites? – Phong

+0

Je crois que Google Chrome ne fait pas que * simplement * chercher l'arrière-plan dans un fil différent, il fait le rendu et tout traitement d'événement pour chaque onglet dans un fil différent. Sinon, vous êtes favori jeu flash dans un onglet pourrait potentiellement dégrader votre expérience de YouPo, er, YouTube dans un autre onglet. – SimonC

0

Ce n'est pas le contrôle qui est dans un fil séparé, mais la demande lancée par le contrôle.

Disons que vous avez deux onglets ouverts sur des adresses différentes. Vous cliquez sur un lien qui vous dirige vers un autre site sur le premier onglet. En attendant, vous cliquez sur un autre lien sur le second onglet.

Tout d'abord, vous devez savoir qu'un fil peut être lancé lorsque vous cliquez sur le lien dans le premier onglet, ce qui rend l'interface graphique réactive. C'est la même chose avec le deuxième onglet, lorsque vous avez cliqué sur le lien. Deuxièmement, nous avons maintenant un thread (le thread principal, également appelé thread graphique) qui est chargé de gérer l'interaction de l'utilisateur. Un autre thread traite la requête depuis le lien sur le premier onglet, et un autre thread depuis le lien sur le deuxième onglet. Troisièmement, pendant que vos demandes de lien pour les deux onglets sont en cours de traitement, vous pouvez ouvrir un nouvel onglet et lancer une recherche sur Google! Ensuite, cela nécessite que votre interface graphique soit réactive, même si l'application, le navigateur, est occupé par vos demandes. Quatrièmement, sur le retour des threads de fond, ils retourneront au thread principal rapportant le résultat de leur travail, c'est-à-dire la réponse Web qu'ils ont obtenue en demandant de résoudre le DNS lié aux liens cliqués.

Une manière intéressante de rendre possible en C#, et en le maintenant aussi facile que possible, est à travers la classe BackgroundWorker.

Chaque instance d'un BackgroundWorker représente un thread. Ainsi, vous devez instancier autant de BackgroundWorker que l'application le requiert lorsqu'un clic de souris est capturé, lorsqu'un utilisateur clique sur un lien. La demande est ensuite envoyée à l'événement DoWork() qui est déclenché lors de l'appel à la méthode RunWorkerAsync().

Here's an interesting tutorial sur la façon d'utiliser le BackgroundWorker

0

Cet article Microsoft explique à peu près comment l'Explorateur Windows fait exactement ce que vous demandez:

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

Vous avez essentiellement un thread par la fenêtre de niveau supérieur et tous les événements de cette fenêtre sont déclenchés sur le même thread.

+0

Pourquoi la downvote? La question est de savoir comment avoir des contrôles GUI sur plus de thread d'événement, ce qui est exactement ce que le texte lié discute. – SimonC

+0

Cela peut-il être adapté pour WinForms? – toddmo

Questions connexes