Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ProgressBar, BeginInvoke, асинхронный метод

9.0K
16 августа 2007 года
EuGenius
48 / / 12.01.2007
Окно во время заполнения прогрессбара не реагирует на действия пользователя, хотя вроде заполнение происходит в асинхронном методе.
Почему форма виснет при заполнении прогрессбара?
вот код (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);            
        }
    }
}
257
16 августа 2007 года
kosfiz
1.6K / / 18.09.2005
нормально все реагирует(на нажатие кнопок реагирует и на движение курсора над кнопками), если ты конечно поставил в progressBar1.Maximum = 29999, поскольку по умолчанию там 100 и если умолчание не изменить и присвоить Value значение большее 100, то вылетит ошибка сопровождающаяся зависанием формы, довольно долгим зависанием. может в этом причина? если нет то, что тогда ты понимаешь под "не реагирует на действия пользователя"
и кстати почему ты используешь float, а не int в цикле for?
9.0K
16 августа 2007 года
EuGenius
48 / / 12.01.2007
Форма виснет при работе метода
Progress()
а когда прогрессбар заполнился, то все нормально дальше работает...
257
16 августа 2007 года
kosfiz
1.6K / / 18.09.2005
нет, ну иногда и чуток подвисать все равно будет(но все равно нажать на кнопки можно, да и форму переместить тоже): ты же вон какую работу делаешь. асинхронная работа же позволяет только имитировать одновременное выполнение задач, а не на самом деле выполнять одновременно.

P.S. повторюсь: у меня вообще не виснет. попробуй запустить без отладки.
9.0K
16 августа 2007 года
EuGenius
48 / / 12.01.2007
Получается так, что форма реагирует на нажатия, перетаскивания раз через три. Видимо из-за того, что система нагружается. ПРОЦ - 100%!!!
9.0K
16 августа 2007 года
EuGenius
48 / / 12.01.2007
Вот так все получается
Код:
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; }));

        }

Необязательно обращаться к форме и менять значение прогрессбара через каждое инкрементирование, ведь это же не критично для пользователя.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог