C# pomoc oko timera i progressbara

poruka: 7
|
čitano: 2.391
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
C# pomoc oko timera i progressbara

Pravim jedan program koji bi trebao da radi jednostavnu stvar...trebalo bi da uradi sledece...nakon sto progressbar zavrsi do kraja loading..da se u textboxu1 ispise "nesto"....evo koda koji je do sad napisan:

 

 

private const Int32 PROGRESS_INTERVAL = 5000;
private const Int32 TIMEOUT = 60000;

private System.Threading.Timer m_tmrProgress, m_tmrTimeout;

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Maximum = TIMEOUT / PROGRESS_INTERVAL;

    m_tmrProgress = new System.Threading.Timer(this.ProgressCallback, null, 1, PROGRESS_INTERVAL);
    m_tmrTimeout = new System.Threading.Timer(this.TimeoutCallback, null, TIMEOUT, 0);

}

private delegate void IncrementTimerDelegate(int i);
private void IncrementTimer(int i)
{
    progressBar1.Increment(i);
}

private void ProgressCallback(object state)
{
    this.Invoke(new IncrementTimerDelegate(this.IncrementTimer), new object[] { 1 });
}

private void TimeoutCallback(object state)
{
    m_tmrProgress.Dispose();
    m_tmrTimeout.Dispose();
}

 
0 0 hvala 0
17 godina
offline
C# pomoc oko timera i progressbara

Hmm.. mislim da si bespotrebno zakomplicirao stvar. Zašto jednostavno na kraj loadinga ne dodaš da se ispiše nešto? To bi bilo i jednostavnije za napisati a i puno brže jer se ne mora stalno provjeravati je li posao gotov.

 
0 0 hvala 0
17 godina
offline
C# pomoc oko timera i progressbara

Evo napisao sam ti ogledni primjer u kojem je to jednostavnije rješeno i bolje (Timer ti baš i nije najbolja metodika, izbjegavaj timer-e)

 


        private const int goToNumber = 200;
        System.Threading.Thread loadThread;

        public Form1()
        {
            loadThread = new System.Threading.Thread(new System.Threading.ThreadStart( this.loadSomething));

        }


        private void button1_Click(object sender, System.EventArgs e)
        {
            if (!loadThread.IsAlive)
            {
                loadThread.Start();
            }
        }

        public void loadSomething()
        {
            int loadingCurrent = 0;
            progressBar1.Maximum = goToNumber;
            progressBar1.Minimum = loadingCurrent;
            while (loadingCurrent < goToNumber)
            {
                progressBar1.Value = loadingCurrent;
                loadingCurrent++;
                System.Threading.Thread.Sleep(100);
            }
        }

 

Pa probaj tako...

"Genius might be the ability to say a profound thing in a simple way." Charles Bukowski
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C# pomoc oko timera i progressbara

Mnogo ti hvala dado, nisam ni znao da ovako moze da se rijesi, u pravu si, timer treba izbjegavati. samo jos jedno pitanje....kako sad da dodam da se nakon sto se progressbar1 ucita do kraja okine neki triger i upise text u textbox? Ako bi mogao jos to da mi napises bio bih ti jako zahvalan.

16 godina
neaktivan
offline
RE: C# pomoc oko timera i progressbara

ubaciš ga iza while petlje? tj. na kraj load funkcije...

progress bar je tu samo kozmetički efekt, a ne nešto prema čemu ćeš se orjentirat...

16 godina
neaktivan
offline
RE: C# pomoc oko timera i progressbara

Radi...hvala mnogo

16 godina
neaktivan
offline
C# pomoc oko timera i progressbara

public partial class Form1 : Form {

    public event EventHandler AddToValue;

    public event EventHandler RemoveFromValue;

    public event EventHandler Status;

    public event EventHandler ValueChanged;

    public delegate bool OnDoIncrement(int incrementNumber);

    public event OnDoIncrement DoIncrement;

    private int increment = 10;

    private BackgroundWorker worker = new BackgroundWorker();

    bool working = false;

    private bool forward = true;

    public Form1() {

        InitializeComponent();

        this.AddToValue += new EventHandler(Form1_AddToValue);

        this.RemoveFromValue += new EventHandler(Form1_RemoveFromValue);

        this.DoIncrement += new OnDoIncrement(Form1_DoIncrement);

        this.Status += new EventHandler(Form1_Status);

        this.ValueChanged += new EventHandler(Form1_ValueChanged);

        worker.WorkerSupportsCancellation = true;

        worker.DoWork += new DoWorkEventHandler(worker_DoWork);

        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {

        working = false;

    }

    private void worker_DoWork(object sender, DoWorkEventArgs e) {

        working = true;

        while (working) {

            if (worker.CancellationPending) break;

            Thread.Sleep(10);

            try { Invoke(DoIncrement, 1); }

            catch { MessageBox.Show("Background worker error."); worker.CancelAsync(); }

        }

        working = false;

    }

    private void Form1_Status(object sender, EventArgs e) {

        MessageBox.Show(this, "Status Of Progress Bar Control.\n" +

                              "Minimum value: " + progressBar1.Minimum.ToString() + "\n" +

                              "Maximum value: " + progressBar1.Maximum.ToString() + "\n" +

                              "Current value: " + progressBar1.Value.ToString() + "\n" +

                              "Increment: " + increment.ToString() + "\n");

    }

    private void Form1_ValueChanged(object sender, EventArgs e){ this.Text = "New Value is: " + progressBar1.Value.ToString(); }

    private bool Form1_DoIncrement(int incrementNumber) {

        int p = progressBar1.Value;

        if (forward) p += Math.Abs(incrementNumber);

        else p -= Math.Abs(incrementNumber);

        if (p <= progressBar1.Maximum && p >= progressBar1.Minimum) progressBar1.Value = p;

        else {

            if (p >= progressBar1.Maximum) progressBar1.Value = progressBar1.Maximum;

            else if (p <= progressBar1.Minimum) progressBar1.Value = progressBar1.Minimum;

            forward = !forward;

        }

        ValueChanged(this, new EventArgs());

        return forward;

    }

    private void Form1_RemoveFromValue(object sender, EventArgs e) { forward = false; DoIncrement(increment); }

    private void Form1_AddToValue(object sender, EventArgs e) { forward = true; DoIncrement(increment); }

    private void button1_Click(object sender, EventArgs e) { AddToValue(sender, e); }

    private void button2_Click(object sender, EventArgs e) { RemoveFromValue(sender, e); }

    private void button3_Click(object sender, EventArgs e) { Status(sender, e); }

    private void button4_Click(object sender, EventArgs e) {

        if (working) worker.CancelAsync();

        else worker.RunWorkerAsync();

    }

}

 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice