2011-12-11 3 views
1

재귀 함수가 있으며 시간, 시도 횟수 및 재귀 함수의 현재 시도를 사용하여 양식을 업데이트하려고합니다. 초마다 양식이 업데이트되어야합니다. 현재 methodinvoker가 작동하지 않습니다. 컴파일러는 줄을 강조 표시하지만 계속하지 않고 다시 나타납니다.타이머 업데이트 관련 문제 양식

나는 이미 별도의 스레드에 함수를 배치하려고했지만 성능이 좋지 않으므로 기본 스레드에서 함수를 유지하는 것이 좋습니다.

아이디어가 있으십니까?

void bruteForce_DoWork() 
{ 
    doBruteForceEID("", 0, wordlen, temp); 
} 

void _myTimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    if (InvokeRequired) 
    { 
     runTimeSec++; 

     this.Invoke(new MethodInvoker(delegate() { this.toolStrip.Text = "Running... " + runTimeSec + "s"; })); 
     Invoke(new MethodInvoker(delegate() { lblAttackA.Text = Convert.ToString(attackCount); })); 
     Invoke(new MethodInvoker(delegate { lblCurAttempt.Text = brute; })); 
    } 
    else 
    { 
     runTimeSec++; 
     toolStrip.Text = "Running... " + runTimeSec + "s"; 
     lblAttackA.Text = Convert.ToString(attackCount); 
     lblCurAttempt.Text = brute; 
    } 

} 

편집 : 나 프로그램 alitte을 설명하게 더 ... 사용자가 확인하고 싶은 것을 자신의 암호를 입력하면 그들이 계산에 충돌 한 후, 다음이 발생합니다. - 더미 재귀 알고리즘을 실행하여 5 초 이내에 머신이 수행 할 수있는 사이클 수를 확인한 다음 평균하여 얼마나 많은 사이클을 초당 할 수 있는지 더 잘 알 수 있습니다. 5 초 타이머가되면

  back = new Thread(new ThreadStart(testLoop_DoWork)); // Calls the dummy algorithm 
      back.Start(); 

      if (rbtnTest.Checked) 
      { 
       txtEID.Text = txtUID.Text; 
       lblRunCycle.Text = "Calculating..."; 
       testTimer.Enabled = true; // Starts the Timer 
      } 

, 나는 길이, 초당 사이클, 어떤 문자 (대문자, 소문자, 숫자, 기호), 그것은 걸리는 시간을 제공하는 각각의 문자 배열을 추가를 확인 brute force char 배열을 만든 다음 스레드를 조인()하고 타이머를 비활성화하십시오. 나는 대략 초당 7 백만 회의 사이클을 얻을 것이다. (이 숫자를 기억하라). 또한, 나는이 시간 동안 GUI를 업데이 트하지 않을거야 .. 그냥 만든 스레드를 실행. 사용자가 공격을 실행하고자하는 그런 경우

, 그것을 수행합니다 나는 새 스레드에 실행을 시작하면, 그것은 초당 약 30,000주기를 표시

 attackBack = new Thread(new ThreadStart(bruteForce_DoWork)); 
     attackBack.Start(); 

     _myTimer.Enabled = true; 

? 내 타이머가 매 초만 업데이트됩니다. 무슨 일 이니?

편집 : 나는 타이머를 주석 처리 했으므로 아무 것도 GUI로 업데이트하지 않습니다. 그리고 같은 결과는 무차별 대입이 발견되었을 때 발생합니다 (예 : 'test'라는 단어가 즉시 있어야 함).하지만 그것을 찾기 위해 10 초가 걸립니다 ...

+1

올바르게 이해한다면 UI 스레드가 계산 집약적 인 작업을 수행하는 중입니다. 어떤 종류의 타이머를 사용합니까, 'System.Threading'또는'System.Windows.Forms'에있는 타이머입니까? 전체 예제를 붙여 넣으시겠습니까? 위의 코드는 나머지 프로그램에 대해 많은 추측을 필요로합니다. –

+0

문제는 아니지만 코드를 복제하지 마십시오. '_myTimer_Elapsed'를'Invoke'에 전달하십시오. –

+0

코드의 첫 번째 부분에서 예, UI가 작업을 수행하고있었습니다.하지만 그것은 집중적 인 작업을 별도의 스레드에 배치 한 후에 발생합니다. 설명과 함께 별도의 스레드에 집중 코드가있는 추가 코드를 게시했습니다. – Questioner

답변

2

예, Timer.Elapsed 이벤트는 스레드 풀 스레드에서 실행됩니다. 즉, InvokeRequired는 항상 true이며 확인하지 않아도됩니다.

UI 스레드가 유휴 상태가 아니며 값 비싼 코드를 실행하고 있습니다.이를 교착 상태라고합니다.이 호출은 Invoke() 호출이며 UI 스레드는 유휴 상태 여야 호출 된 코드를 실행할 수 있습니다.

이 있으면 작업자 스레드가 UI 스레드 대신 비싼 코드를 실행하게하십시오. 어느 것이 UI 스레드를 반응 적으로 유지합니다. 라벨을 업데이트하고 UI를 그려지며 사용자 입력에 응답합니다. 당신은 당신이 이런 식으로하는 것을 좋아하지 않는다고 말 했습니다. 왜 당신이 그것에 문제가 있는지는 불분명합니다. 고전적인 실수는 UI를 너무 자주 업데이트하여 호출 요청으로 넘쳐 흐르지 않으므로 더 이상 정규 업무를 수행하지 못합니다. 실제로 시간에 맞춘 업데이트가 해결책입니다. 초당 25 회 이상 업데이트하지 마십시오. 인간의 눈은 그 이상으로 자주 차이를 느낄 수 없습니다.

+0

alittle을 설명하기 위해 내 게시물을 업데이트했습니다. – Questioner

+0

그게 무슨 뜻인지 전혀 모르겠습니다. 퍼포먼스 계산시 5 초를 구울 수는 없습니다. 인간이 신경 쓰지 않도록 5 밀리 초로 만드십시오. 여전히 1 천만 사이클이 넘습니다. –

+0

5ms 만 정확한 판독 값을 제공하지 않습니다 .. 초당 평균 40,000 사이클. 500ms라도 780,000 만을줍니다. 나는 5ms에서 15s까지 모든 것을 시도해 왔으며 사이클이 일치 할 때만 2-4 초 정도 걸립니다. 이 측정은 입력을 해독하는 데 걸리는 시간을 사용자에게 보여주기위한 것입니다. 실용적이라면 실제로 공격을 실행할 수 있습니다. – Questioner

관련 문제