2014-09-22 3 views
0

У меня есть форма с кнопкой и текстовым полем. Кнопка запускает поток, который обновляет значение текстового поля.Обновление темы GUI зависает в случайных моментах

public Form1() 
    { 
     InitializeComponent(); 
     myDelegate = new UpdateUi(updateUi); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     myThread = new Thread(new ThreadStart(ThreadFunction)); 
     myThread.Start(); 
    } 
    private void ThreadFunction() 
    { 
     MyThreadClass myThreadClassObject = new MyThreadClass(this); 
     myThreadClassObject.Run(); 
    } 
    private void updateUi(int i) 
    { 
     textBox1.Text = i.ToString(); 
     Thread.Sleep(1000); 
    } 
    public Thread myThread; 
    public delegate void UpdateUi(int i); 
    public UpdateUi myDelegate; 

и ThreadClass:

public class MyThreadClass 
{ 
    Form1 myFormControl1; 
    public MyThreadClass(Form1 myForm) 
    { 
     myFormControl1 = myForm; 
    } 

    public void Run() 
    { 
     // Execute the specified delegate on the thread that owns 
     // 'myFormControl1' control's underlying window handle. 
     for(int i=0;i<100;i++) 
     { 
      if(myFormControl1.InvokeRequired) 
      { 
       myFormControl1.Invoke(myFormControl1.myDelegate,i); 
      } 

     } 


    } 
} 

Как Вы можете видеть, что нет ничего особенного в моем коде, но иногда заморозки кода.

например, это 1-> 2-> 3-> замораживание-> 16-> 17 и так далее.

Я взял код из HERE с небольшими изменениями

+1

«Thread.Sleep» в этом примере - только для его замедления. Вы не хотите этого, поэтому просто удалите его из своего кода. –

+0

Итак, вы говорите мне, что «Thread.Sleep» несет ответственность за это странное поведение? – szpic

+0

Ему это нужно, чтобы видеть цифры в 'textBox1'. – GeorgeChond

ответ

1

Этим вопросом вы задерживающие потоком пользовательского интерфейса не сам процесс, так что происходит, вы выдаете все команды обновления, но так как это все работает на том же проденьте забивается, потому что Thread.Sleep останавливает поток пользовательского интерфейса, поэтому он запускает связку textBox1.Text = i.ToString();, тогда он останавливается на все время всего Thread.Sleep(1000);, вероятно, число 1-> 2-> 3 ... вы видите, равно количеству ядер в вашей машине.

Если вы остановите метод запуска, то выполните одну команду обновления, которая запускается немедленно, и подождите одну секунду, пока вы не произнесете следующую команду, я думаю, что это то, что вы пытаетесь выполнить.

Смежные вопросы