1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программирован. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление
  2. Чат codeby в telegram перезагрузка. Обсуждаем вопросы информационной безопасности и методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие. Подробнее ...

    Скрыть объявление

Progressbar, Begininvoke, асинхронный метод

Тема в разделе ".NET - программирование", создана пользователем EuGenius, 16 авг 2007.

  1. EuGenius

    EuGenius Гость

    Репутация:
    0
    Окно во время заполнения прогрессбара не реагирует на действия пользователя, хотя вроде заполнение происходит в асинхронном методе.
    Почему форма виснет при заполнении прогрессбара?
    вот код (FW 2.0):
    Код:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ProgressBar
    {
    public partial class Form1 : Form
    {
    private delegate void Async();
    
    private void Progress()
    {
    pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = true; }));
    for (float i = 0; i < 30000; i++)
    {
    progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = (int)i; }));
    }
    pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = false; }));
    }
    
    public Form1()
    {
    InitializeComponent();
    }
    
    private void btnEnter_Click(object sender, EventArgs e)
    {
    try
    {
    progressBar1.Value = Convert.ToInt32(textBox1.Text);
    }
    catch (Exception)
    {
    MessageBox.Show("При выполнении преобразования типов возникла ошибка");
    return;
    }
    }
    
    private void btnStart_Click(object sender, EventArgs e)
    {
    Async prdelegate = new Async(Progress);
    AsyncCallback cb = new AsyncCallback(CallBackMethod);
    prdelegate.BeginInvoke(cb, prdelegate);			
    }
    
    private void CallBackMethod(IAsyncResult ar)
    {
    Async prdelegate = (Async)ar.AsyncState;			
    prdelegate.EndInvoke(ar);			
    }
    }
    }
     
  2. mms

    mms Гость

    Репутация:
    0
    Специально для этого есть класс BackgroundWorker (для того, чтобы не париться с инвоками, потоками и делегатами :( ).

    А вообще после строчки:

    Код:
    progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = (int)i; }));
    надо написать:

    Код:
    Application.DoEvents();
    Итого:

    Код:
    progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = (int)i; }));
    Application.DoEvents();
     
  3. EuGenius

    EuGenius Гость

    Репутация:
    0
    Для: sax_ol

    Финт в том, что сразу использовалась флоатовская переменная и шаг был 0,2.
    А progressBar1.Value принимает только интовские переменные. так и осталось. лень исправлять. это на скорость не влияет.

    http://msdn2.microsoft.com/en-us/library/ms993020.aspx - а здесь я уже был. хотелось бы свое чудо докрутить до ума...
     
  4. EuGenius

    EuGenius Гость

    Репутация:
    0
    Вот так все получается
    Код:
    private void Progress()
    {
    pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = true; }));
    
    for (int i = 0; i < 30000; i++)
    {
    if(i%1000 == 0) progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value = i; }));
    Application.DoEvents();
    }
    pictureBox1.Invoke(new MethodInvoker(delegate { pictureBox1.Visible = false; }));
    
    }
    Необязательно обращаться к форме и менять значение прогрессбара через каждое инкрементирование, ведь это же не критично для пользователя.
     
Загрузка...
Похожие Темы - Progressbar Begininvoke асинхронный
  1. Shouldercannon
    Ответов:
    0
    Просмотров:
    1.122
  2. BlackShadow
    Ответов:
    2
    Просмотров:
    3.107
  3. medin84
    Ответов:
    8
    Просмотров:
    3.762
  4. LuMee
    Ответов:
    5
    Просмотров:
    3.987

Поделиться этой страницей