user3552714
user3552714

Reputation:

Progressbar not Progressing in c#

The Code is given below. it receives filepaths in a list from Form1 and then whole transformation takes place here and everything is working fine BUT the PROBLEM is that progressbar1 does not progress.. what could be the reason? Thanks in advance!

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        numericUpDown1.Enabled = false;
        numericUpDown2.Enabled = false;
        button1.Enabled = false;
    }

    List<string> filepath_ = new List<string>();
    int count = 0, total = 0;
    private string format = string.Empty;
    private int _height = 0;
    private int _width = 0;

    internal void passpath(List<string> fp)
    {
        filepath_.AddRange(fp);
        total = filepath_.Count;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Stop")
        {
            backgroundWorker1.CancelAsync();
            button1.Text = "Transform";
            return;
        }
        else
        {
            button1.Text = "Stop";
            System.Threading.Thread.Sleep(1);
            backgroundWorker1.RunWorkerAsync();
        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        foreach (string filepath in filepath_)
        {
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            ImageFormat imageFormat = ImageFormat.Jpeg;
            switch (format)
            {
                case "JPEG":
                    imageFormat = ImageFormat.Jpeg;
                    break;
                    break;
                default:
                    break;
            }
            string finalpath = filepath.Substring(0, filepath.IndexOf('.'));
            Image image1 = Image.FromFile(filepath);
            string ext = Path.GetExtension(filepath);

            if (_height != 0 && _width != 0 && format!=string.Empty)
            {
                Bitmap bitmap = new Bitmap(image1, _width, _height);
                bitmap.Save(finalpath + " (" + _width.ToString() + "x" + _height.ToString() + ")." +format, imageFormat);
            }
            else if (_height != 0 && _width != 0)
            {
                Bitmap bitmap = new Bitmap(image1, _width, _height);
                bitmap.Save(finalpath + " (" + _width.ToString() + "x" + _height.ToString() + ")" + ext);
            }
            else if (format != string.Empty)
            {
                Bitmap bitmap = new Bitmap(image1);
                bitmap.Save(finalpath+"." + format, imageFormat);
            }
            count++;

            int i = ((count / total) * 100);

            backgroundWorker1.ReportProgress(i);
            System.Threading.Thread.Sleep(1);
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;

        label6.Text = count.ToString() + " Out of " + total.ToString() + " Images transformed";


    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        button1.Text = "Transform";
        progressBar1.Value = 0;

        if (e.Cancelled)
            MessageBox.Show("Transformation stopped. " + count.ToString() + " images transformed.");
        else if (e.Error != null)
            MessageBox.Show(e.Error.Message);
        else
        {
            MessageBox.Show(count.ToString() + " Images Transformed");
            Application.Exit();
        }
    }

    private void listBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        format = ((ListBox)sender).SelectedItem.ToString();
        button1.Enabled = true;
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        _width = 640;
        _height = 480;
        button1.Enabled = true;
    }
    }
}
}

Upvotes: 0

Views: 104

Answers (3)

HackerMan
HackerMan

Reputation: 914

pBar.Step = 2;
pBar.PerformStep();

Upvotes: 0

JeffRSon
JeffRSon

Reputation: 11176

The problem had already been pointed out by Grant Winney: It's the integer division.

Without changing data types of count and/or total you could use this:

int i = (int)((100.0 * count) / total)

or that:

int i = (100 * count) / total

where the former makes 100.0 * count a double and the division by total as well. The latter sticks to integer operations by simply multiplying count first (changing sequence of operations), such that the division will not be 0 as long as count is not 0.

Upvotes: 1

Grant Winney
Grant Winney

Reputation: 66449

Change you variables to doubles:

double count = 0, total = 0;

When you do this calculation:

int i = ((count / total) * 100);

You're currently doing integer arithmetic. The result of count / total (i.e 1 / 10 or 4 / 10) is rounded to 0. When you divide that by 100, the result is still 0, so your ProgressBar won't move.

Using the double type will correctly store the fractional part of your quotient.

Upvotes: 1

Related Questions