Прогресс-бар в DLL - PullRequest
       3

Прогресс-бар в DLL

0 голосов
/ 16 января 2019

Я создаю DLL, которая содержит цикл некоторых данных

как я могу отобразить индикатор выполнения

Я пытался создать новую форму окна и отображал то же самое в цикле for

но он просит меня закрывать форму каждый раз

1 Ответ

0 голосов
/ 16 января 2019

Люди на SO здесь не для того, чтобы писать код для вас, а для решения проблем. В любом случае, я расскажу вам, как вы можете это сделать, и вы создадите собственный код на его основе.

Прежде всего, DLL - это библиотека динамических ссылок, и таким образом вы можете присоединить ее к любому вашему проекту (winform или unity 3d игра, и нет, вы не будете делать это, но допустим, что она может использоваться в обоих случаях), поэтому если вы уже пишете DLL, сделайте ее пригодной для использования во многих сценариях и дайте программисту, использующему ее, множество возможностей для манипулирования.

Итак, ваша задача здесь разделена на 2 части.

  • Рассчитать данные
  • Сообщите, на каком этапе расчета вы сейчас находитесь

Для этой задачи мы будем использовать события и простой цикл for, чтобы показать вам, как это работает.

Прежде всего давайте создадим EventArgs класс, который будет хранить все данные, которые мы хотим передать, когда программист из другого события перехвата кода

public class CustomEventArgs
{
    public int OldResult { get; set; }
    public int NewResult { get; set; }
}

Теперь, когда у нас есть класс событий, давайте реализуем его в нашем коде.

public class YourDllCalculation
{
    // In the .NET Framework class library, events are based on the EventHandler delegate and the EventArgs base class.
    // So we create delegate using our newly created class to represents it like EventHandler
    public delegate void ResultChangeEventHandler(object sender, CustomEventArgs e);

    // Now we create our event
    public event IzborRobeEventHandler ResultChanged;

    // Local storing variable
    private int Result = 0;

    // This is method from which you inform event something changed and user listening to event catch EventArgs passed (in our case our CustomEventArgs)
    protected virtual void OnResultChange(CustomEventArgs e)
    {
        ResultChangeEventHandler h = ResultChanged;
        if (h != null)
            h(this, e);
    }


    // We will use this method from new code to start calculation;
    public void StartCalculation()
    {
        // Calculation will be done in separate thread so your code could proceed further if needed
        Thread t1 = new Thread(Calculate);
        t1.Start();
    }

    private void Calculate()
    {
        for(int i = 0; i < 100; i++)
        {
            OnResultChange(new CustomEventArgs() { OldResult = i, NewResult = i + 1 });
            Result = i;
            Thread.Sleep(1000); // Pause thread from running for 1 sec
        }
    }
}

Теперь, когда у нас есть код, мы можем использовать его следующим образом в нашей winform:

// Add at top
using YourDllNamespace;


public YourForm()
{
    // Creating our class for calculation
    YourDllCalculation calc = new YourDllCalculation();
    calc += CalculationResultChanged;
    calc.Calculate();
}

private void CalculationResultChanged(object sender, CustomEventArgs e)
{
    // Here do whatever you want with passed values
    // e.OldResult;
    // e.NewResult;
    // it will fire each second
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...