2011-06-14 5 views
3

나는 GUI 창 양식이 있습니다. 나는 pictureBox에 이미지를 설정하고 다음에 3 초 동안 sleep하고 싶습니다.GUI 양식 및 스레드 잠자기에 설정 무어

pictureBox.Image = image; 
    Thread.Sleep(3000); 

하지만 위의 내 코드처럼한다면, 내 양식은 후 내 양식 자체를 그립니다 다음, 이미지를 설정 3 초 동안 잠 가서하려고합니다. 그래서 내 그림은 3 초 후에 보여. 어떻게 이미지를 설정하고, 보여 주며, 바로 그 후에 "잠들"을 할 수 있습니까? 1

편집 정확히 내가 그런 일을하고 싶지 :

나는 두 개의 스레드, UI 및 GUI가 있습니다. UI는 net 소켓에서 읽고 GUI에서 올바른 방법으로 호출합니다. GUI에 설정 이미지

  • UI 전화 : GUI에

    • UI 전화 : 그리고 그와 같은 스크립트 될 수 있습니다 뭔가를 할

    를 (다음 GUI 이미지를 지워야합니다) 그러나 나는 확실히 갖고 싶어, 나는이 이미지를 볼 수있을 것이다. 그래서 GUI set image 후에, 나는이 스레드를 3 초 동안 호출한다. 그래서 어떻게 할 수 있습니까?

    예 : (GUI에서 작용)

    public void f1() { 
        MethodInvoker method =() => { 
          pictureBox.Image = image; 
          pictureBox.Update(); 
          // do something more 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    
    public void f2() { 
        MethodInvoker method =() => { 
          pictureBox.Image = null; 
          pictureBox.Update(); 
          // do something more 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    

    다른 함수 F3 ... FN

    public void f3() { 
        MethodInvoker method =() => { 
          // do something 
        }; 
    
        if (InvokeRequired) { 
          Invoke(method); 
        } else { 
          method(); 
        } 
    
    } 
    

    는 그리고 난과 F2 후, 내 UI 스레드 호출 함수 F1을 할 내 사용자가이 사진을 볼 수 있는지 확인하십시오. 하지만 내 UI 스레드가 함수 f1을 호출하고 f3..fn 사이의 일부가 정상적으로 호출하는 경우 내가 (UI에 의해 호출) GUI 형태의 기능 정의 :

    편집이

    없음 나는 것을 확인하지

    public void f1() { 
         MethodInvoker method =() => { 
           pictureBox.Image = image; 
           pictureBox.Update(); 
         }; 
    
         MethodInvoker method2 =() => { 
           // something 
         } 
    
         if (InvokeRequired) { 
           Invoke(method); 
           Thread.Sleep(3000); // sleep UI thread 
           Invoke(method2); 
         } else { 
           method(); 
           method2(); 
         } 
        } 
    

    그것은 작동을하지만, 최선의 해결책이 아닙니다. 이 스크립트는 다음과 같습니다.

    UI가 3 초 동안 잠자기 상태가되고 예상치 않습니다.

    내 문제의 가장 좋은 해결책은 무엇입니까?

  • +1

    수면 이전에 this.Refresh()를 넣으십시오. 그것은 최선의 해결책은 아니지만 일해야합니다. –

    답변

    3

    는 이들 중 하나 시도 : 나는 WindowsForms 있으리라 믿고있어

    Form.Refresh(); 
    Application.DoEvents; 
    

    Application.DoEvents

    .

    +0

    고마워, 작동 해;) – nirmus

    +0

    어떤 옵션이 효과가 있었습니까? (장래 독자를 위해). [또한 대답을 수락하면 응답 할 필요가 없다는 것을 다른 사람들에게 알릴 수 있습니다.] –

    +3

    전체 양식과 모든 컨트롤을 다시 칠하는 것은 의미가 없습니다. pictureBox.Update()가 가장 좋습니다. DoEvents가 최악입니다. 훨씬 최악. –

    3

    GUI를 절대로 절대로 안된다. 적어도 당신이하는 방식은 아닙니다. Thread.Sleep 또는 다른 차단 메커니즘을 사용하면 UI가 수행 중이라고 가정하는 것을 막을 수 있습니다. 디스 패칭 및 처리 메시지.

    지연된 동작을 실제로 발생 시키려면 System.Windows.Forms.Timer을 사용하는 것이 좋습니다. 당신이해야 할 일이 여기에 있습니다.이것은 물론 당신이 "잠을 자다"라는 의미에 대한 모호한 이해를 바탕으로합니다.

    • 이미지를 설정하십시오.
    • 그런 다음 "잠자기로 이동"이 무엇인지 시뮬레이트하는 데 필요한 모든 컨트롤을 즉시 해제하십시오.
    • 그런 다음 타이머를 시작하십시오.
    • 마지막으로 Tick 이벤트에서 "잠자기로 이동"이 의미하는 바를 뒤집는 코드를 추가하십시오.
    +0

    정확히 그런 식으로하고 싶습니다. 두 개의 스레드, UI 및 GUI가 있습니다. UI는 net 소켓에서 읽고 GUI에서 올바른 방법으로 호출합니다. 그리고 다음과 같은 스크립트가 될 수 있습니다 : - GUI에서 UI 호출 : 이미지 설정 - GUI 호출 UI : 무언가 수행 (GUI에서 이미지를 지워야 함) 하지만이 이미지를 볼 수 있습니다. . 그래서 GUI set image 후에, 나는이 스레드를 3 초 동안 호출한다. 그래서 어떻게 할 수 있습니까? 추신. 어떻게 코멘트에 새로운 라인을 추가 할 수 있습니까? – nirmus

    +0

    @nirmus :이 추가 정보로 답을 수정하십시오. 다른 스레드를 사용하고 있다는 사실은 내 대답을 근본적으로 바꿀 수 있습니다. 자세한 내용을 제공하면 더 많은 도움을 드릴 수 있습니다. –

    관련 문제