Trouver l'id d'un thread

DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 16 mars 2008 à 20:28
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 18 mars 2008 à 20:01
Bonjour à tous,
J'utilise QueryPerformanceCounter
 et pour des raisons expliquées là http://msdn2.microsoft.com/en-us/library/ms644904(VS.85).aspx je dois utiliser SetThreadAffinityMask. Cette fonction prends en paramètre le handle du thread physique. Lorsque l'on a besoin de ce handle pour le thread courrant, il existe des exemples qui utilisent la fonction Win32 GetCurrentThreadId() http://www.themssforum.com/Csharp/HyperThreading-ProcessorAffinity/. Dans mon cas, je crée le thread et je voudrais lui affecter un AffinityMask de façon externe. Je dois donc retrouver l'id de ce thread. Il existe une fonction Win32 GetThreadId qui est "documentée" par un névropathe de chez Microsoft qui explique en résumé que pour obtenir le id du thread il suffit de passer un handle... Quelqu'un sait-il ce comment obtenir ce handle ?
Merci de votre aide.
st.antoine

2 réponses

taupe4 Messages postés 91 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 17 avril 2008 1
18 mars 2008 à 12:33
1. Obtient le processus qui contient les threads. Par exemple "Process[] p = Process.GetProcesses("devenv")". Une des propriétés de Process est p.Threads qui retourne la liste des threads du processus.
Note: Si tu désires obtenir ton processus à toi, tu fais Process.GetCurrentProcess().

2. Utilise SetThreadAffinityMask sur le thread désiré, ou SetProcessAffinityMask si tu veux l'appliquer au processus entier.
0
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
18 mars 2008 à 20:01
Merci de ta réponse,
Commen fais-je pour reconnaitre dans la liste des thread du process, celui qui correspond au thread sur lequel je veux affecter SetThreadAffinityMask. Car ce  n'est pas sur mon processus à moi que veux appliquer cette propierté mais sur un autre.
Voici le code qui me sert d'exemple :
using System;
using System.Runtime.InteropServices;

using System.Diagnostics;
using System.Threading;
namespace Tester
{
class Program
{
[DllImport("kernel32")]
static extern int GetCurrentThreadId();
static void Main()
{
Thread t = new Thread(
new ThreadStart(DoWork));
t.Start();
t.Join();
}
static void DoWork()
{
foreach(ProcessThread pt in Process.GetCurrentProcess().Threads)
{
// Voilà c'est ici : Pour trouver le utid du threadcourrant OK, mais comment faire si il s'agit d'un autre thread. Dans mon cas, il s'agit d'un trhread qui fait le QueryPerformanceCounter (voir plus bas) ?

int utid = GetCurrentThreadId();
if (utid == pt.Id)
{
pt.ProcessorAffinity = (IntPtr)(1); // Set affinity for this
thread to CPU #1
Console.WriteLine("Set");
}
}
}
}
}
// Ici mon thread sur leque je voudrais applique l'ProcessorAffinity

public
long Stop(){

QueryPerformanceCounter(

out stopTime);

return(stopTime);}

Merci encore.
0
Rejoignez-nous