Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Choix dans quel processeur va s'exécuter un thread [ Système / Exécution ] (jdek)

mardi 3 juin 2008 à 14:14:32 | Choix dans quel processeur va s'exécuter un thread

jdek

Bonjour,

Voila, j'ai un formulaire qui lance sur demande un thread qui exécute des calculs.
Le problème c'est que ces calculs sont assez longs, 15 s, et pendant ce temps, je souhaite pouvoir naviguer dans mon formulaire.
Donc dans ce threads, de temps en temps, j'ai mis l'instruction : Thread.Sleep(0); qui rend la main au système.
Etant donné que mon formulaire utilise des objets graphiques (avec dégradés, path, ...) donc lourds , j'aimerai que le thread de calcul s'exécute sur l'autre processeur (Dual-Core), plutôt que sur celui où le formulaire s'exécute déjà, car sinon mon formulaire se met à rammer.
Bien sur j'aurai pu diminuer le temps processeur alloué au calcul, en mettant par exemple Thread.Sleep(50); mais ca rallonge le temps de calcul à plusieurs minutes.
Donc j'aimerai savoir si vous connaissez des instructions qui permettent de choisir sur quel processeur va s'exécuter un thread.

Merci



mardi 3 juin 2008 à 15:05:28 | Re : Choix dans quel processeur va s'exécuter un thread

sebmafate

Membre Club Administrateur CodeS-SourceS
hum... Thread.Sleep(...) ne donne pas la main au système ! il met en suspend le thread courrant x millisecondes.

Je te conseille de monter une architecture multhi threading... regarde du coté du BackgroundWorker... voire le Pattern Asynchronous (http://www.csharpfr.com/codes/IMPLEMENTATION-PATTERN-ASYNCHRONOUS_41848.aspx)


Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]

mardi 3 juin 2008 à 15:40:50 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Oui, ca met en suspend le thread, mais laisse la main aux autres threads (sinon, ca bloquerai mon formulaire).
Le problème c'est que j'ai besoin d'exécuter au maximum proche du matériel (presque du temps réel), donc je ne peux pas me permettre de gérer  trop d'évènements qui peuvent venir altérer mes calculs.
Avec le BackgroundWorker, est-ce que c'est possible d'attribuer son thread sur un certain processeur ?

Jdek

mardi 3 juin 2008 à 15:47:01 | Re : Choix dans quel processeur va s'exécuter un thread

sebmafate

Membre Club Administrateur CodeS-SourceS
en .net tu ne peux pas attribuer à un processeur donné une tache.
par contre, en multi-threading, les taches s'exécutent parallèle... et le pattern Asynchronous fonctionne super bien, je l'ai utilisé dans de très gros projets...


Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]

mardi 3 juin 2008 à 19:59:23 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Ok merci pour l'info, je vais essayer de regarder ca.

jdek

mardi 3 juin 2008 à 20:41:56 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Si il y en a que ca intéresse, j'ai imaginé une méthode disons barbare , pour "forcer" la gestion du processeur à faire en sorte que le thread soit exécuté sur le processeur où le programme principal ne s'exécute pas.  Lors du start du thread, on fait tourner "à bloc" le processeur sur lequel est le programme principal, ce qui devrait avoir pour effet le démarrage du thread sur l'autre processeur, comme ca par exemple :
int compteur;
do
{
    compteur++;
    if(compteur == 1000)
    {
       monAutreThread.Start(methodeDeMonAutreThread);
    }
}
while(compteur < 1000);

Bon, on ne peut plus artisanal comme méthode ^^, et je n'ai pas encore essayer.  Disons que pour l'instant c'est la seule méthode que je connaisse, peut être que si l'on peut consulter sur quel processeur est exécuter un thread, il y a moyen de se débrouiller plus méthodiquement.  Je vous tiens au courant.



mercredi 4 juin 2008 à 11:23:39 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Bon cette méthode marche si le thread est en priorité maximale (Highest), donc on ne peut utiliser cette méthode que si ce thread est le seul à s'exécuter sur le deuxième processeur, sinon il y a risque de fort ralentissement des autres threads.
Je n'est pas encore relevé d'erreur à cette méthode, mais ca pourrai bien arrivé.
(Si un autre programme utilise beaucoup la CPU, cette méthode risque de ne pas marcher).

Jdek

mercredi 4 juin 2008 à 11:33:05 | Re : Choix dans quel processeur va s'exécuter un thread

sebmafate

Membre Club Administrateur CodeS-SourceS
c'est surtout pas propre...

sincèrement, je préfère laisser l'os gérer lui-même les threads.




Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]

mercredi 4 juin 2008 à 11:51:21 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Je suis bien d'accord,
mais il semble que .net rend possible le changement de processeur : [ Lien ]
à essayer.


Jdek

mercredi 4 juin 2008 à 16:07:50 | Re : Choix dans quel processeur va s'exécuter un thread

jdek

Réponse acceptée !
Donc j'ai essayer, et ca marche nikel. C'est juste un peu galère pour trouver le n° du thread car il n'y a que par son numéro système que l'on peut y arriver. En fait, la collection récupérée est triée par ordre de création de chaque thread de l'application.  Pour connaitre le n° d'un thread, il suffit de récupérer le dernier objet ProcessThread de la collection juste après la création du thread,  sachant que dans le processus, une fois l'application lancée, il n'y a pas de création de threads supplémentaires (15 environ au démarrage).

Voila comment j'ai procédé :
...
using System.Diagnostics;
using System.Threading;

..................

            ProcessThreadCollection Collection = Process.GetCurrentProcess().Threads;

            foreach (ProcessThread P_Thread in Collection)
            {
                     //Déplacement de tous les threads du processus sur le processeur 1, (le 2 est réservé pour la mesure)
                P_Thread.ProcessorAffinity = new IntPtr(1);  
            }
           
            Thread_mesure = new Thread(Funct_mesure);
            Thread_mesure.IsBackground = true;
            Thread_mesure.Priority = ThreadPriority.Normal;
            Thread_mesure.Start();
           
            //Récupération du n° du dernier Thread créé, afin de le lancer sur l'autre processeur (donc le 2)
            Collection = Process.GetCurrentProcess().Threads;

            Collection[Collection.Count - 1].ProcessorAffinity = new IntPtr(2);   //Collection.Count-1 correspond au dernier thread

...............

Voila ca peut toujours servir, lorsqu'on veut utiliser les ressources CPU à fond (surtout pour les Dual-Core), sachant qu'il est possible de faire changer le thread de processeur pendant son exécution.  On peut par exemple créer un gestionnaire interne de performance. A voir... Si vous avez des objections, des conseils, je prend volontier ^^.

Jdek


1 2

Cette discussion est classé dans : formulaire, temps, exécuter, thread, processeur


Répondre à ce message

Sujets en rapport avec ce message

Timer Thread ??? [ par Globinours ] Voilà mon problème en fait j'ai une RichTextBox et j'effectue une opération assez longue sur l'évenement OnSelectionChanged. Ce que je voudrais c'est multi ouverture formulaire [ par nounours21_6 ] Bonjour,je fais un programme qui affiche dans un form (style msn) une alerte qu'on a programmé...mais ce formulaire ne peut pas s'ouvrir plusieur en m Temps de calcul processeur [ par Manu94600 ] Salut à tous,Voilà je suis en train de faire un programme en C# qui calcul toutes les posibilités dans un parcours labyrinthe. Et mon interfase freeze Thread [ par catamenia ] bonjours,J'ai un thread qui tourne afin de récupérer des informations sur un serveur.Quand l'information souhaitée arrive, je crée un nouveau formulai thread [ par Moomoon07 ] Salut !Je connais un peu les thread, qui permettent de démarrer plusieurs processus en même temps, s'executant alternativement, qui peuvent s'attendre Focus sur un Formulaire créé dans un Thread [ par AlexBob789 ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB Temps processeur [ par T103 ] Bonsoir,Je voudrais recuperer le temps du processeur total, donc j'utilise un PerformanceCounter qeu voici :Je lai mi dans un timer mais mon label aff thread d'un form [ par trdev ] bonjourje commence à regarder les threads et j'ai des questions :si j'ai bien compris chaque formulaire est un thread particulier ... ou je me trompe. multi-thread ou comment fair plusieur foi la même chose en même temps [ par Dr_shaman ] Voila suite au conseille d'un internaute j'ai fais un client-serveur. Mon client est une dll dans SharePoint, elle capture un événement et envoi une j'ai besoin de 4 thread qui tourne en même temps [ par Dr_shaman ] Bonjour, <v:path gradientshapeok="t" o:co


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.