begin process at 2010 02 10 10:38:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Exécution

 > 

Appel synchrone bloquant (code TRES simplifié)


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

Appel synchrone bloquant (code TRES simplifié)

lundi 14 janvier 2008 à 05:10:19 | Appel synchrone bloquant (code TRES simplifié)

Zeroc00l

Membre Club
Bonjour !
J'ai un petit souci sur les appels synchrones en C#
Je vais simplifier le probleme :

Dans un thread j'éxécute mon code général qui ressemble à ca :

do
{
   while
(trucs.Count > 0) //trucs est un container qui contient des trucs
   {
      Truct = /*on recupere un element de trucs*/;
      
      my_thread_pool.Add(t, newSuccessNotifierDelegate(delegate(TrucAnalyse analyse_de_truc, bool success)
      {
         // en fonciton de analyse_de_truc, on ajoute potentiellement de nouveaux element dans "trucs"  
      }
   }
   Thread.Sleep(20); // Dort 20 ms dans le caso u il n'y a que des traitement a faire
//On peut n'avoir aucun truc dans "trucs" mais avoir encore des analyse à faire qui en ajouterons peut etre ...
} while (my_thread_pool.ProcessCount > 0);



Mon thread de pool appel les delegate qu'on lui passe comme ceci :

try
{
   IAsyncResult aResult = file.OnDownloadTerminate
            .BeginInvoke(
Thread .CurrentThread, !error, filetype, null , null );
   aResult.AsyncWaitHandle.WaitOne();    // IMPORTANT : Attend que l'appel se termine
   file.OnDownloadTerminate.EndInvoke(aResult);
}
catch { } // Rien de spécial a faire .. si l'utilisateur sait pas écrire du code fiable c'est son probleme

Au départ il n'y a qu'un élément dans trucs.
Une tâche est donc affecté à mon pool de thread (classe que j'ai codé, qui est plus complexe que la classe de pool de thread) auquel je fournis du code à appeler quand latache "t" se termine.
Point important :
Le sous thread de mon pool qui analyse truc et auquel on passe un delegate DOIT attendre que le code du delegate soit executé avant de continuer.. parce en gros ce qu'il fait apres c'est de decrementer my_thread_pool.ProcessCount !
Si my_thread_pool.ProcessCount vaut zero le thread principale se barre ... sans que le delegate n'ait été appelé
Mais avec BeginInvoke et EndInvoke pas de probleme il attend justement :)
Le probleme c'est justement qu'il attend indefiniment ...
Quelle(s) instruction(s) mettre quelquepart dans les deux boucles pour que le sous thread se synchronise et execute le delegate ?
Je me souviens (houla c'est loin :) ..) qu'en VB y'a DoEvent qui permet de traiter les evenements sur la pile "des choses à faire" avant de continuer l'execution du code sur lequel on etait ...
Y'aurait pas un équivalent en C# ?


Merci !!!

-={[ Zeroc00l ]}=-
lundi 14 janvier 2008 à 11:35:29 | Re : Appel synchrone bloquant (code TRES simplifié)

sebmafate

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
l'équivalent du DoEvent...

Application.DoEvents();

Voila ;)


Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
mardi 15 janvier 2008 à 02:19:43 | Re : Appel synchrone bloquant (code TRES simplifié)

Zeroc00l

Membre Club
Je ne comprends pas ... Mon code marche maintenant sans Application.DoEvents(); :-/
Il n'y a plus de bloquage (j'ai bien verifié avec des breakpoints bien placé pour vérifier que c'etait pas le hasard )
A n'y rien comprendre !
Cela dit tu as répondu à ce que je demandais... même si je ne suis pas persuadé que cela débloquera les delegates la prochaine fois que je retomberais sur le problème.

Merci !
(je pense jamais au namespace Application ... :-/)

-={[ Zeroc00l ]}=-


Cette discussion est classée dans : code, thread, trucs, delegate, pool


Répondre à ce message

Sujets en rapport avec ce message

Thread : un code en vs2003 vers vs2005 [ par cedoli ] Salut à tous.J'utilise un thread pour aller lire le code source d'une page HTML et l'afficher dans un TB.void go()         {            (new client CreateDelegate, delegate et gestion des evenements [ par SagothSquid ] Bonjour à tous     J'ai un petit problème concernant la gestion de delegate sur des eventHandler.  Explicat Thread [ par Equinox84 ] Bonjour, Désolé de poser cette question mais je viens de faire un mois de Java et j'ai du mal a reprendre les notions de thread en C# En fait je vou Pool de thread et scruter des repertoire en Delphi 7 [ par yanis97 ] Bonjour; Je cherche deux composant Delphi 7 qui : 1- Implémente un pool de threads avec des workers/pile 2- permet de surveiller un repertoire Merc controle listbox dans un thread [ par diego29 ] bonjour ,je souhaite afficher des nombres premiers dans une listbox à travers un threadvoici mon code sans erreur de compilation mais qui n'affiche ri [2.0] BackWorker & synchronisation main thread [ par scoubidou944 ] bonsoir,je viens à la pêche au code propre comme d'hab';pJe refais mon LiveUpdate en .NET 2.0 et j'ai découvert le BackWorker :)J'explique le programm Éviter qu'une thread perde la main [ par narfight ] Bonjour,Je voudrais savoir comment signaler qu'une partie de mon code exécuté dans une thread soit éxécuté en 1 seul fois et donc que le thread ne per communication entre thread [ par olibara ] BonjourSi quelqu'un se sent expert en Thread il pourra peut etre m'aiderL'ideal pour expliquer serait de pouvoir envoyer un bout de code malheureuseme Thread + Classe Trace - Réalisation d'une fenêtre de Debug [ par TeK55 ] Bonjour à tous, Je suis en train de développer un nouveau programme avec un autre développeur, et pour faciliter la maintenance, j'ai pour mission de Opération inter thread sur showdialog [ par mastereur ] bonjour, petite explication avant tout, j'ai une Form qui crée un thread, et lors d'une action, ce thread ouvre une autre Form (du style MessageBox p


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,374 sec (4)

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