Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2018, 11:13   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию Обновление GUI

тривиальная проблема: обновить интерфейс пока работает вычисление.
Хочу выводить информацию в ListBox.
инет предлагает DoEvents, Invoke - не получается.

Вот набросок как сейчас не работает - информация выводится после окончания работы.
Код:
private void AddToListBox(object oo)
{
    Invoke(new MethodInvoker(
                delegate { listBox1.Items.Add(oo); }
        ));
}

public static void VeryMain()
{
    
    Offers OfferList = GetOffers(XMLdoc);
    
    AddToListBox("=====================================");
    AddToListBox($" {OfferList.Count} ");
    AddToListBox("=====================================");
    foreach (var item in OfferList)
    {
        AddOfferToProduct(item);
    }
    AddToListBox("=FIN=");
}

private void AddOfferToProduct(Offers offer)
{
    foreach(var item in offer)
    {
        AddToListBox($"={item.Message}=");
        foreach(var param in item.param)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
        
        foreach(var param in item.param1)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
    }
}
Может backgroundworker задействовать? Нахожу только примеры где выводится
Код:
e.ProgressPercentage
в поле. А как текст выводить разный?

Може кто подскажет как изменить приведенный фрагмент чтобы использовать backgroundworker?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 13.07.2018, 11:40   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Любое из async/await, Task/TPL, BackgroundWorker, Thread (Invoke обычно нужно только для последнего).
Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Нахожу только примеры где выводится
e.ProgressPercentage
в поле. А как текст выводить разный?
в е есть не только это.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 13.07.2018 в 12:07.
Alex11223 вне форума Ответить с цитированием
Старый 14.07.2018, 00:05   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

С BackgroundWorker запутался что, куда писать надо.

async
ошибка cannot convert from 'void' to 'System.Action'
Код:
private void AddToListBox(object oo)
{
 listBox1.Items.Add(oo);
}

public async static void VeryMain()
{
    
    Offers OfferList = GetOffers(XMLdoc);
    
    AddToListBox("=====================================");
    AddToListBox($" {OfferList.Count} ");
    AddToListBox("=====================================");
    foreach (var item in OfferList)
    {
        Task task = new Task (AddOfferToProduct(item, PathXLSProductsLocal)); 
        task.Start();
        await task;
    }
    AddToListBox("=FIN=");
}

private void AddOfferToProduct(Offers offer)
{
    foreach(var item in offer)
    {
        AddToListBox($"={item.Message}=");
        foreach(var param in item.param)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
        
        foreach(var param in item.param1)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
    }
}
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 17.07.2018, 08:54   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Не работает
Код:
private void AddToListBox(object oo)
{
 listBox1.Items.Add(oo);
}

public async static void VeryMain()
{
    Offers OfferList = GetOffers(XMLdoc);
    AddToListBox("=====================================");
    AddToListBox($" {OfferList.Count} ");
    AddToListBox("=====================================");
    foreach (var item in OfferList)
    {
        await AddOfferToProduct(item, PathXLSProductsLocal); 
    }
    AddToListBox("=FIN=");
}

private async Task<bool> AddOfferToProduct(Offers offer)
{
    if (offer == null || PathXLSProductsLocal == "")
    {
         return false;
    }
    foreach(var item in offer)
    {
        AddToListBox($"={item.Message}=");
        foreach(var param in item.param)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
        foreach(var param in item.param1)
        {
            try
            {
                AddToListBox($"={param.Message}=");
            }
            catch(Exeption ex)
            {
                AddToListBox($"={ex.Message}=");
            }
        }
    }
    return true;
}
ищу дальше
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 17.07.2018, 10:02   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.07.2018, 11:24   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

По описанию, можно просто текст передавать как 2-й параметр.

Вроде расставил как в примерах, но опять неудача
Код:
public class Offer
{
    public int ID { get; set; }
    public string Message { get; set; }
    public List<string> Param { get; set;}
    public List<string> Param1 { get; set; }
}
//список записей
public List<Offer> Offers;

/// <summary>
/// генерация списка записей
/// </summary>
/// <returns>список записей</returns>
private List<Offer> ReadALotOfOffers()
{
    List<Offer> ofrs = new List<Offer>();
    Offer ofr = new Offer();
    string msg = string.Empty;
    for (int i = 0; i < 100; i++)
    {
        ofr = new Offer()
        {
            ID = 10000 + i,
            Message = $"This is {ofr.ID} item's message",
        };
        ofr.Param = new List<string>();
        ofr.Param1 = new List<string>();
        for (int j = 0; j < 100; j++)
        {
            ofr.Param.Add($"Param #{j+1} for {ofr.ID} ");
        }
        for (int j = 0; j < 100; j++)
        {
            ofr.Param1.Add($"Param #{j + 1} for {ofr.ID} ");
        }
        ofrs.Add(ofr);
    }
    return ofrs;
}

/// <summary>
/// запуск обработки
/// </summary>
private void btnStart_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

/// <summary>
/// вывод информации в listBox
/// </summary>
/// <param name="offer">запись</param>
/// <param name="worker">backgroundworker который используется</param>
private void AddOfferToProduct(Offer offer, BackgroundWorker worker)
{
    foreach (var item in offer.Param)
    {
        try
        {
            worker.ReportProgress(0, $"={offer.ID} {item}=");
        }
        catch (Exception ex)
        {
            worker.ReportProgress(0, $"={offer.ID} {ex.Message}=");
        }
    }
    foreach (var param in offer.Param1)
    {
        try
        {
            worker.ReportProgress(0, $"={offer.ID} {param}=");
        }
        catch (Exception ex)
        {
            worker.ReportProgress(0, $"={offer.ID} {ex.Message}=");
        }
    }
}



private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    Offers = ReadALotOfOffers();
    worker.ReportProgress(0,"=====================================");
    worker.ReportProgress(0, $" {Offers.Count} ");
    worker.ReportProgress(0, "=====================================");
    foreach (var item in Offers)
    {
        AddOfferToProduct(item, worker);
    }
    worker.ReportProgress(0, "=FIN=");
}

/// <summary>
/// остановка выполнения
/// </summary>
private void btnStopCalculation_Click(object sender, EventArgs e)
{
    backgroundWorker1.CancelAsync();
}


/// <summary>
/// конец работы backgrounda
/// </summary>
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        AddToListBox("Canceled!");
    }
    else if (e.Error != null)
    {
        AddToListBox( "Error: " + e.Error.Message);
    }
    Else
    {
        AddToListBox("Done!");
    }
}

/// <summary>
/// обработка изменения прогресса
/// </summary>
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    AddToListBox(e.UserState.ToString());
}

/// <summary>
/// добавление строки в listBox
/// </summary>
/// <param name="oo">строка для добавления</param>
private void AddToListBox(object oo)
{
    listBox1.Items.Add(oo);
}
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 19.07.2018, 14:25   #7
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Не получается отображать ход работы. После запуска, в listBox"е наблюдаю уменшение размера вертикального скролбара и все. UI не реагирует на мышь, текст, который записался в listBox, отображается только после окончания работы.

upd.
Оставлю так.
Код:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            Offers = ReadALotOfOffers();
            worker.ReportProgress(0,"=====================================");
            worker.ReportProgress(0, $" {Offers.Count} ");
            worker.ReportProgress(0, "=====================================");
            foreach (var item in Offers)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                else
                {
                    AddOfferToProduct(item, worker);
                    System.Threading.Thread.Sleep(80);
                }
            }
            worker.ReportProgress(0, "=FIN=");
        }
Может со временем найду лучший вариант или подскажет кто
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 19.07.2018 в 15:14.
Aleksandr H. вне форума Ответить с цитированием
Старый 20.07.2018, 16:59   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Код:
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestWFApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            btnStop.Enabled = false;
        }

        private CancellationTokenSource cancellationTokenSource;
        

        private async void btnStart_Click( object sender, EventArgs e )
        {
            SwitchBtnsEnabledState();
            cancellationTokenSource = new CancellationTokenSource();
            await DoMyLongLongWork( cancellationTokenSource.Token );
        }

        private void SwitchBtnsEnabledState()
        {
            btnStop.Enabled = !btnStop.Enabled;
            btnStart.Enabled = !btnStart.Enabled;
        }

        public async Task DoMyLongLongWork( CancellationToken token )
        {
            var array = await ReadALotOfOffers();

            foreach ( var val in array )
            {
                if ( token.IsCancellationRequested )
                    return;
                listBox1.Items.Add( await AddOfferToProduct( val ) );
                await Task.Delay( 100 );
            }
        }

        Task< string > AddOfferToProduct( int val )
        {
            return Task.Factory.StartNew(  () =>
                             {
                                 Thread.Sleep( 10 );
                                 return $"========== {val} =============";
                             },TaskCreationOptions.LongRunning  );
        }

        Task< int[] > ReadALotOfOffers()
        {
            return Task.Factory.StartNew( () =>
                             {
                                 Thread.Sleep( 10 );
                                 return Enumerable.Range( 0, 1000 ).ToArray();
                             },TaskCreationOptions.LongRunning );
        }

        private void btnStop_Click( object sender, EventArgs e )
        {
            cancellationTokenSource.Cancel();
            SwitchBtnsEnabledState();
        }
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GUI Алинка_Ы Общие вопросы по Java, Java SE, Kotlin 0 27.11.2016 22:38
GUI 7zzzzz7 Visual C++ 26 20.09.2011 17:55
GUI MovsesIV Общие вопросы C/C++ 7 08.12.2010 16:25
C++ и GUI DimOn4Ik Visual C++ 8 24.06.2010 20:22
GUI и Си (?) Дырдин Общие вопросы C/C++ 3 15.01.2010 20:39