2013-11-02 2 views
2

4 개의 MenuItem이있는 Gtk.Menu가 있습니다. 다음 코드는 각각의 MenuItem의 Label.Text을 변경하는 매 초마다 실행 : 나는 우분투 리눅스에 monodevelop 3.0.3.2와 모노 2.10.8.1을 사용하고Gtk.Label.Text 변경이 항상 작동하지 않는 경우

double d = new Random().NextDouble(); 

for (int i = 0; i < 4; i++) 
{ 
    ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
} 

.

문제가

문제 모든 레이블 업데이트지고 있다는 점이다 (가끔 만 때로는 첫 번째와 마지막으로, 제 1 및 제 2). 이유는 무엇

for (int i = 0; i < 4; i++) 
{ 
    ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
    Thread.Sleep(1); // HACK !!! 
} 

질문

  1. 에게 : 나는 각 루프에 1 ms 동안 스레드 잠을 수 있도록함으로써이 문제를 극복 할 수

    내 빠른 해킹 이 문제는?

  2. 더 나은 솔루션은 무엇입니까?

답변

3

그 이유는 당신이 주요 GTK 스레드 외부 프론 GUI를 업데이트하는 것입니다. 당신이 Gtk.Application.run를 호출 할 때

이벤트 루프를 소유 주요 GTK 스레드가 생성됩니다.

여러 가지 방법이 link가 관심이 될 수

Gtk.Application.Invoke (delegate { 
     double d = new Random().NextDouble(); 

     for (int i = 0; i < 4; i++) { 
      ((Label)((MenuItem)menu.Children[i]).Child).Text = d.ToString(); 
     } 
    }); 

Gtk.Application.Invoke을 시도 할 수, 업데이트에 대한 avalaible 있습니다.

+0

많은 감사합니다. 정확히 내가 찾고 있었던 것이 었습니다. – sergej

관련 문제