2010-08-13 3 views
0

192.168.0.0 -192.168.255.255 과 같은 범위에서 네트워크 주소를 내 listview에 쓰려 고 스레드 응용 프로그램을 작성했지만이 응용 프로그램을 실행할 때 모든 스레드가 주소를 추가하려고합니다. listview에 간단한 해결책이 있습니까?모든 작업이 같은 작업을 수행하는 모든 스레드

여기 내 코드입니다 :

namespace ListNetworkComputers 
{ 
    public partial class frmMain : Form 
    { 
     public frmMain() 
     { 
      InitializeComponent(); 
     } 

     const int step = 16777216; 
     int threadCount = 1; 

     private void frmMain_Load(object sender, EventArgs e) 
     { 
      ıpAddressControl1.Text = "192.168.0.0"; 
      ıpAddressControl2.Text = "192.168.255.255"; 
     } 

     private void btnShowPcc_Click(object sender, EventArgs e) 
     { 

      threadCount = Convert.ToInt32(nudThreads.Value); 


      Thread[] threads = new Thread[threadCount]; 

      for (int i = 0; i < threadCount; i++) 
      { 
       threads[i] = new Thread(new ThreadStart(getPerformance)); 
       threads[i].Name = string.Format(i.ToString()); 
      } 

      foreach (Thread t in threads) 
      { 
       t.Start(); 
      } 
     } 

     private void getPerformance() 
     { 
      uint startIntAdress, endIntAdress; 

      startIntAdress = BitConverter.ToUInt32(IPAddress.Parse(ıpAddressControl1.Text).GetAddressBytes(), 0); 
      endIntAdress = BitConverter.ToUInt32(IPAddress.Parse(ıpAddressControl2.Text).GetAddressBytes(), 0); 

      for (uint i = startIntAdress; i < endIntAdress; i = i + step) 
      { 
       string ipAddress = new IPAddress(BitConverter.GetBytes(i)).ToString(); 
       lbNetworkComputers.Items.Add(ipAddress); 
      } 
     } 
    } 
} 

와 또 다른 문제는, 내 단계 방법 (... 16777216로 adresses을 increaseing)은 건강한 작업 밤은. 192.168.0.0에서 192.168.0.255로 바뀌지 만 이후에는 그렇지 않습니다.

답변

1

각 스레드는 IP 주소를 통한 루프가 각 스레드로 전달되는 메서드 내부에있는 것과 정확히 동일한 코드를 실행합니다.

각 스레드에 다른 시작 및 끝 주소를 전달해야합니다.

또한 UI에 액세스하는 스레드에 문제가 있습니다.

게시 한 코드에서이 코드가 실제로 스레드되어야하는지 잘 모르겠습니다.

+0

그래 당신 말이 맞아,이 과정 나던 내가 각 시스템에 대한 성능 카운터를 얻을 것이다 스레드가 필요하므로이 나를 위해 간단한 방법입니다. – Rapunzo

+0

@Rapunzo - 괜찮습니다. 뭔가 빠뜨린 것 같았습니다. – ChrisF

3

그들은 동일 startIntAdressendIntAdress을 갖기 때문에. 모든 스레드에 대해 균등하게 범위를 분할하십시오.

그것은 다음과 같이해야한다 :

Thread 1 starts at 192.168.0.0 and checks 32 addresses 
Thread 2 at 192.168.0.31 and checks 32, 
Thread 3 at 192.168.0.63 and checks 32, 
etc 
+0

또는 더 나은 방법은 개별 스레드가 다음 주소를 가져 와서 중앙 집중식 기능을 검사하도록하는 것입니다. – tdammers

+0

differend 작업을 수동으로 제공해야합니까? 예를 들어 스레드는 주소를 찾지 못했을뿐입니다. – Rapunzo

+0

@Rapunzo : 어떻게 든 시작할 수있을 때 매개 변수 ('foreach'에서 쓰레드 t 인덱스)를 쓰레드로 넘길 수 있습니다. 그래서 쓰레드는 다음과 같이 시작 주소를 계산할 수 있습니다 (이 경우 IP의 마지막 바이트) :'part4 = (255/threadCount) * threadIndex;'주의 : threadCount는 1,2,4,8,16,32,64, ...의 값이어야합니다. 알림을 얻으려면 == 0 – Im0rtality

관련 문제