2011-07-31 2 views
-1

안녕하세요 저는 버튼을 누른 후 지연 시간이 200 밀리 초의 흰색 원을 표시하여 뇌를 속이며 3 분 후에 아무런 지연도 표시하지 않고 약간의 실험을 시도하고 있습니다 하지만 내 이미지 상자가이미지 상자가 보이지 않는 경우 true

public void CircleDelay() 
    { 
     Thread.Sleep(200); 
     imgCircle.Visible = true; 
     Thread.Sleep(150); 
     imgCircle.Visible = false; 
    } 
    public void CircleNonDelay() 
    { 
     imgCircle.Visible = true; 
     Thread.Sleep(150); 
     imgCircle.Visible = false; 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     button1.Text = @"Click!"; 
     if(time == null) 
     { 
      time = DateTime.Now.ToString(); 
     } 

     if (DateTime.Now < Convert.ToDateTime(time).AddMinutes(3)) 
     { 
      // 
      CircleDelay(); 
     } 
     else 
     { 
      // 
      CircleNonDelay(); 
     } 

    } 
+0

"이미지 상자"란 무엇입니까? 어떻게 당신은 버튼을 "집착"합니까? –

답변

0

문제는 방법 CircleDelay()CircleNonDelay()있는 경우에 true = 볼에 응답하지 않습니다, UI 스레드는 UI를 업데이트하고 이미지를 표시 할 수있는 시간이 점점되지 않습니다. 일단 기회가 생기면 이미지 가시성을 false으로 설정 한 코드가 이미 실행되어 이미지를 볼 수 없습니다.

는 UI 스레드가 무료 도착하면 그래서, 당신은 이미 false에 가시성을 설정하고 동일한

당신이

을해야 다른 방법의 문제입니다

public void CircleNonDelay() 
    { 
     //UI thread sets the visibility to true 
     imgCircle.Visible = true; 
     //then UI thread sleeps for 150 ms (note the UI thread haven't updated the UI yet because it will do that once it is free from tasks assigned to it) 
     Thread.Sleep(150); 
     //UI thread sets visibility to false again 
     imgCircle.Visible = false; 
    } 

이 코드를 고려

public void CircleNonDelay() 
    { 
     imgCircle.Visible = true; 
     // start a background worker or timer which will raise an event after 150 ms 
     //and call imgCircle.Visible = false; inside that event 
    } 
+0

대단히 감사합니다. –

0

Windows Forms는 화면에 그릴 때만 UI 스레드가 유휴 상태가됩니다. 즉, 이벤트 처리기 중 하나에없는 경우입니다. Thread.Sleep()을하면 UI에 다시 그리는 기회가 주어지지 않습니다.

Update()으로 전화를 걸면 변경 내용이 표시되거나 Application.DoEvents()으로 전화하여 제어 기능을 수행하고 화면을 다시 그립니다.

실제로 UI 스레드에서 Thread.Sleep()을 호출하여 수행하는 작업은 사용자를 업데이트하거나 사용자에게 응답하지 않도록 UI를 잠그는 것입니다. UI가 응답하도록 그림 상자를 표시하거나 숨기려면 Timer을 사용해야합니다().

관련 문제