2016-07-22 4 views
1

나는 내 IP를 검사하는 간단한 응용 프로그램을 만들었습니다. 아이디어는 : 나는 버튼을 클릭하면내 ip가 이전 제품과 비교하여 고유한지 확인하십시오.

1) 앱이 내 IP를 확인하고 이전 IPS

와 비교합니다

2) 나의 새로운 IP가 이전처럼 동일한 경우 수행 아무것도

3) 나의 새로운 IP는 이전과는 다른 내가 unique을 증가시키고 dataGridRow1 새 행에 추가하기 전에이 IP를 한 적이 없다면

4) 나의 새로운 IP 나의 새로운 IP는 이전과 다른,하지만 증가 duplicate 전에이 IP에 할당 dataGridRow1 새 행

에 추가 된 적이 있다면 내 기본 IP 증가 my_ip

5) 경우

6) 모든 dataGrid1 중복 된 IP를 포함하는 BackColor 행은 빨간색입니다.

전역 변수 :

string old_ip = ""; 
string new_ip = ""; 
int new_row = 0; //new added row position 
int duplicate = 0; 
int my_ip = 0; 
int unique = 0; 

지연 기능

public void MyDelad(int milliseconds) 
{ 
    Stopwatch stopwatch = Stopwatch.StartNew(); 
    while (stopwatch.ElapsedMilliseconds <= (long)milliseconds) 
    { 
     Application.DoEvents(); 
    } 
} 

Button_click 이벤트

가 포함되어있는 경우 기본의 코드로 가자는 녹색 컬러

확인의 IP

MyDelad(500); while (true) //force obtain new_ip { try { new_ip = new System.Net.WebClient().DownloadString("https://api.ipify.org"); } catch { MyDelad(500); continue; } break; } if (old_ip != new_ip) //compare old and new ip { unique++; dataGridView1.Rows.Add(new_ip); if (new_ip == "121.464.544.122") //if new ip is my default { my_ip++; unique--; //if it's default ip instead of unique dataGridView1.Rows[new_row].Cells[0].Style.BackColor = System.Drawing.Color.Green; } else //check every row if ip existed before { for (int x = 0; x < dataGridView1.Rows.Count - 2; x++) //check from first to penultimate row { if (dataGridView1.Rows[x].Cells[0].Value.ToString() == new_ip.ToString()) { duplicate++; } } } new_row++; //increment new added row position } old_ip = new_ip; } 

내 첫 번째 질문 : 전역 변수를 사용하는 것이 잘못되었다고 들었습니다. 그러나 button_click 이벤트에서 로컬 변수를 사용하면 모든 버튼을 클릭 한 후에 변수 값이 재설정됩니다 (예 : unique 값을 저장하는 변수). 그럼 전역 변수를 사용해야합니까?

두 번째 질문 : 다른 방법으로 unique 값을 저장할 수 있습니까? 지금은 값이 old_ip != new_ip 인 경우 증가합니다. 그리고 거기에 new_ip == '121.464.544.122'이면, 내 기본값이기 때문에 unique 값을 뺍니다.

세 번째 질문 :Button_Click 이벤트를 실행할 때 응용 프로그램이 "동결"되지 않도록하려면 어떻게해야합니까?.

네 번째 질문 : 내 코드를 개선하는 방법에 대한 아이디어가 있습니까? 아마 이전 ip를 텍스트 파일이나 배열에 저장하는 것이 더 낫겠습니까?

답변

1

그냥 포인터 ...

데이터의 경우 속성으로 변수가있는 단순한 클래스를 만듭니다. 양식에서 클래스의 인스턴스를 하나만 가질 수 있습니다.이 클래스는 수집 한 모든 IP 주소 (키)와 발견 한 횟수 (값으로)가있는 사전도 가질 수 있습니다. 이렇게하면 더 쉽게 검색 할 수 있습니다.

동결과 같이 ... 클릭 이벤트의 (차단) 코드는 별도의 스레드에서 실행해야합니다. 그런 다음 호출로 MyDelad() 함수를 잊어 버릴 수도 있습니다. 물론 스레드 안전을 염두에 두어야합니다.

관련 문제