2014-05-21 2 views
2

Je souhaite changer l'image de la boîte de l'image lorsque ma carte (un module USB) est connectée ou disjointe à l'ordinateur. Mais je pense que mon fil s'exécutera juste une fois. Et l'image de la boîte d'image ne changera pas.L'image de la zone d'image ne change pas en C#

mon code:

bool boardjoined = false; 
void BoardConnecion() 
{ 
    foreach (var item in SerialPort.GetPortNames()) 
    { 
     if (item == "COM3") 
     { 
      boardjoined = true; 
      DisplayImage(_pic_usb, "on.png"); 
     } 
     else 
     { 
      boardjoined = false; 
      DisplayImage(_pic_usb, "off.png"); 
     } 

    } 
} 

public Form1() 
{ 
    InitializeComponent(); 

} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    _pic_usb.Image = Bitmap.FromFile(Application.StartupPath + @"\off.png"); 

    new Thread(new ThreadStart(BoardConnecion)).Start(); 

} 

private void DisplayImage(PictureBox pic, string picName) 
{ 
    pic.Invoke(new EventHandler(delegate 
    { 
     pic.Image = Bitmap.FromFile(Application.StartupPath [email protected]"\" + picName); 
    })); 
} 
+0

essayer d'ajouter un cycle dans '' BoardConnecion' avec quelques Delay' - 100ms. Donc, le fil va vérifier toutes les 100ms si une carte est connectée –

+0

mais je veux thread va vérifier chaque moment.pas par timer.my programme doit écouter le port à chaque instant et de transférer des informations – user3374618

+0

qui serait mauvais, sans délai, il va causer 100% de charge sur le processeur. Le retard de 100ms ou 50ms n'est pas une grosse affaire. Vous attendez déjà l'initialisation du driver (cela prend un certain temps depuis la connexion du forum jusqu'à ce que COM3 soit crété ou non?) Aussi, ce serait une bonne idée de lancer DisplayImage seulement quand l'état est changé –

Répondre

1

Vous pouvez faire une boucle sans fin dans le BoardConnection.

void BoardConnecion() 
    { 
     while(true) 
     { 
      foreach (var item in SerialPort.GetPortNames()) 
      { 
       if (item == "COM3") 
       { 
        boardjoined = true; 
        DisplayImage(_pic_usb, "on.png"); 
       } 
       else 
       { 
        boardjoined = false; 
        DisplayImage(_pic_usb, "off.png"); 
       } 

      } 
      Thread.Sleep(500); 
     } 
    } 

Vous devriez probablement ajouter un interrupteur de sécurité pour sortir de la boucle. =)

+1

il sera bon d'ajouter un peu de retard, ou il peut être méchant - 100% de la charge du processeur et donc –

+0

bon point. ajoutée –

0

vous pouvez utiliser le code mentionné ci-dessous

private System.Timers.Timer timerClock = new System.Timers.Timer();  
timerClock.Elapsed += new ElapsedEventHandler(OnTimer); 
timerClock.Interval = 1000; 
timerClock.Enabled = true; 

public void OnTimer(Object source, ElapsedEventArgs e) 
{ 
    foreach (var item in SerialPort.GetPortNames()) 
     { 
      if (item == "COM3") 
      { 
       boardjoined = true; 
       DisplayImage(_pic_usb, "on.png"); 
      } 
      else 
      { 
       boardjoined = false; 
       DisplayImage(_pic_usb, "off.png"); 
      } 

     } 
}