2011-05-14 5 views
2

저는 생산자/소비자 문제를 구현하고 있습니다. 코드는 다음과 같습니다컨트롤이 무효화되는 것을 감지하는 방법은 무엇입니까?

void producer() 
{ 
    // produce item 
    // update some control in form 
} 

void consumer() 
{ 
    // consume item 
    // update some control in form 
} 

생산자와 소비자 방법은 내 양식을 작성한 다른 스레드에서 실행되는, 그래서 나는 형태로 컨트롤을 업데이트 할 수 없습니다. 나는 다음과 같은 코드를 시도했다 :

void producer() 
{ 
    // produce item 
    // put the work to be done in a queue 
    this.Invalidate(); 
} 

void consumer() 
{ 
    // consume item 
    // put the work to be done in a queue 
    this.Invalidate(); 
} 

그래서 이제 폼이 무효화되었는지 감지해야한다. 저는 Form의 이벤트 목록을 살펴 보았고 가장 좋은 것은 페인트 이벤트였습니다. 작업을 완료 한 코드를 넣으면 제대로 작동합니다. 문제는 어떻게 작동하는지는 모르겠지만 올바른 방식으로이 작업을 수행했는지 의심 스럽습니다. 저는 그림이 아닌 페인트가 일을하는 데 적합한 장소가 아니라고 생각합니다. 나는 이것을 할 수있는 더 좋은 방법이 있는지 궁금 해서요.

편집 - 발췌문에서 Invalidated에 대한 이벤트 핸들러가

public Form1() 
{ 
    InitializeComponent(); 
    this.Invalidated += InvalidateEventHandler; 
} 
void producer(object o) 
{ 
    // produce 
    // put work in queue 
    this.Invalidate(); 
} 
public void InvalidateEventHandler(object sender, InvalidateEventArgs e) 
{ 
    // Do Stuff to form -- Where exception raises 
} 

답변

4

무효화는 페인트를 시작하기위한 것입니다.

필요한 것은 Control.Invoke() 양식의 새로 고침 방법입니다.

편집 :

귀하의 비 GUI 스레드도(), 그들은 GUI를 건드릴 수 없어 무효화를 호출하지 않아야합니다.

당신은 당신의 자신의 ProcessData() 양식 방법을 쓸 수 있고, 생산성에서/단점 그리고 ProcessData()에 데이터에 대한 스레드 안전 액세스와 GUI

+0

아마도 알 수 없습니다. 하지만 스레드가 작성자가 아닌 문제를 해결하는 방법은 무엇입니까? 설명해 주시겠습니까? – atoMerz

+0

이 문제를 해결하기 위해 Invoke가 만들어졌습니다. –

+0

감사합니다. – atoMerz

1

를 작동하지 않는 당신은 무효화 당신 자신의 구현

public new void Invalidate() 
    { 
     // place your logic here 
     base.Invalidate(); 
    } 

끄트머리 양식 Invalidated 이벤트 느릅 나무가 트리거가 만들어 new 키워드를 사용하려고 할 수 있습니다 무효화 종료 후

편집 :

public void InvalidateEventHandler(object sender, InvalidateEventArgs e) 
{ 
    anotherForm.Invoke(new Action(() => 
    { 
     // Do Stuff to form -- Where exception raises 
    })); 
} 
+0

@Stecya 아으을 무효화 할 책임이 mainForm.Invoke(ProcessData)

전화 ! 예, Invalidated 이벤트가 있지만 속성 창에 표시되지 않습니다. idk 왜, 코드에서 시도했는지 표시되었습니다. 하지만 내 자신의 구현을 사용하여 Invalidate(), 아니, 작동하지 않습니다 때문에 내 양식을 만든 스레드가 아닌 다른 스레드와 Invalidate 전화 해요, Invalidate 실행 한 것이고 그래서 같은 문제. – atoMerz

+1

다음 이벤트를 사용하여 솔루션입니다 – Stecya

+1

불행히도, 그것은 작동하지 않습니다, 나는 왜 그런지 모르겠다. Invalidated 이벤트에 새 이벤트 처리기를 추가하고 실행될 때 양식을 만든 스레드가 아닌 다른 스레드에서 업데이트되는 것과 동일한 오류가 발생합니다. : – atoMerz

관련 문제