begin process at 2008 08 29 10:57:17
1 233 567 membres
105 nouveaux aujourd'hui
14 291 membres club

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)

Choix dans quel processeur va s'exécuter un thread le 03/06/2008 14:14:32

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



Re : Choix dans quel processeur va s'exécuter un thread le 03/06/2008 15:05:28

sebmafate
Membre Club
(Admin CS)
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]

Re : Choix dans quel processeur va s'exécuter un thread le 03/06/2008 15:40:50

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

Re : Choix dans quel processeur va s'exécuter un thread le 03/06/2008 15:47:01

sebmafate
Membre Club
(Admin CS)
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]

Re : Choix dans quel processeur va s'exécuter un thread le 03/06/2008 19:59:23

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

jdek

Re : Choix dans quel processeur va s'exécuter un thread le 03/06/2008 20:41:56

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.



Re : Choix dans quel processeur va s'exécuter un thread le 04/06/2008 11:23:39

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

Re : Choix dans quel processeur va s'exécuter un thread le 04/06/2008 11:33:05

sebmafate
Membre Club
(Admin CS)
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]

Re : Choix dans quel processeur va s'exécuter un thread le 04/06/2008 11:51:21

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


Jdek

Re : Choix dans quel processeur va s'exécuter un thread le 04/06/2008 16:07:50

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


[Page 1 Page 2]
Classé sous : formulaire, temps, exécuter, thread, processeur

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS