2017-10-08 3 views
0

Je veux savoir comment puis-je appeler un thread à partir d'un autre thread dans C# Windows Form Application. Je développe l'interface utilisateur en utilisant la communication TCP/IP. Dans mon programme, j'envoie les données de l'application Console (client) à Windows Form Application (serveur) après avoir reçu les données que je veux tracer à l'interface utilisateur sur Picture Box.Comment appeler un fil d'un autre fil en C#?

J'ai créé les deux threads sur le serveur premier thread est le thread d'écoute (qui écoute le client socket) et le deuxième thread est le thread Handler (qui gère les données reçues du socket client) Je veux créer le Graphiques traçant le fil du fil de gestionnaire.

Actuellement, je fais le graphique graphique dans le thread de gestionnaire, mais je veux le faire dans un fil séparé. s'il vous plaît guidez-moi comment puis-je le faire?

+0

Quels types d'objet sont 'chemin' et 'g'? –

+0

"chemin" trace en continu et "g" trace en point – SN25

+0

Que voulez-vous dire appeler un fil d'un autre fil? Le thread est-il déjà en cours d'exécution et vous souhaitez lui transmettre des données? –

Répondre

0

Il y a un million de façons de dépecer ce chat, mais voici ma suggestion pour l'approche la plus simple. Je suppose que vous savez comment créer des fils, etc.

using System; 
using System.Collections.Generic; 
using System.Threading; 

namespace foo 
{ 
    class Packet 
    { 
     public double x; 
     public double y; 
     public double z; 
    } 

    public class Class1 
    { 
     Queue<Packet> qp; 

     public Class1() 
     { 
      qp = new Queue<Packet>(); 
     } 

     public void SendData(Packet p) 
     { 
      // prevent reader from accessing while we insert 
      lock (qp) 
      { 
       qp.Enqueue(p); 
      } 
     } 

     public void ProcessIncomingPackets() 
     { 
      Packet p; 

      // or until we decide to stop 
      while (true) 
      { 
       p = null; 

       // prevent the writer from adding while we're reading and maybe removing an item 
       lock (qp) 
       { 
        if (0 < qp.Count) 
        { 
         p = qp.Dequeue(); 
        } 
       } 

       // with lock released, do something if we have a packet 
       if (null != p) 
       { 
        // graph, etc. 
       } 

       // spin faster for better responsiveness and more wasted CPU 
       Thread.Sleep(100); // milliseconds 
      } 
     } 

    } // Class 1 
} // namespace 

Il y a aussi un million de façons d'optimiser, mais aussi créer des bugs vraiment méchant. Donc je vous suggère de faire quelques lectures sur la synchronisation, les threads, les structures de données pour le passage des messages, et celles spécifiques à C#. Un bon livre d'informatique sur les threads de synchronisation génériques fournit généralement une base essentielle pour comprendre les différentes implémentations spécifiques aux plates-formes/langues que vous rencontrerez au fil des années. Tester n'importe quel code multithread dans des boucles serrées est une bonne idée, surtout si vous ne pouvez pas prouver l'exactitude de votre synchronisation directement.