begin process at 2012 02 11 11:38:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Exécution

 > 

Choix dans quel processeur va s'exécuter un thread


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Choix dans quel processeur va s'exécuter un thread

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ée 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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,479 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales