Pagina 1 van 1

Threads in C# (Winforms)

Geplaatst: 17 nov 2004, 19:43
door DiViNO
Voor't school heb 'k een applicatie moeten maken die random getallen genereert en daarna sorteert.
'k heb het aantal random getallen en 't plafond van die random getallen laten bepalen door de gebruiker, nu 't genereren van random getallen duurt ni lang, maar sorteren met bubblesort daarentegen wel :p

Nu zou 'k graag in de statusbar onderaan men applicatie iets zetten ala Bezig met sorteren......... waar die puntjes opbouwen en weer verdwijnen na nen tijd en dan terug opbouwen, etc... (code heb 'k al getypt dus da is in orde ;))

Dus ik zou willen als 'k op sorteren klik dat de Sorteer methode in men bewerking klasse wordt opgeroepen maar terwijl de statusbar wordt aangepast met bovenstaande code.


Hoofdthread = Sorteren van men rij.
Backgroundthread = Progressie puntjes laten zien in statusbar


Sorteren is een static methode in men Bewerking klasse en die Statusbarprogress is een private methode in men form klasse.

app front end:

Afbeelding

Ik hoop dat jullie begrijpen waar ik heen wil... :)

Vraag2: Als er iemand ook ineens weet hoe ge de hoofdthread kunt annuleren zodat ge niet MOET wachten tot het sorteren gedaan is, dan zou 'k da ook graag weten :)

een streepje code:

HOOFDTHREAD:

Code: Selecteer alles

      public static object[] BubbleSort(IVergelijk verg, params object[] aObj)
      {
         for (int i = 1; i < aObj.Length; i++)
         {
            for (int j = aObj.Length - 1; j >= i; j--)
            {
               if (verg.GroterDan(aObj[j-1] , aObj[j]))
               {
                  Wissel (ref aObj[j-1], ref aObj[j]);
               }
            }
         }

         return aObj;
      }


BACKGROUNDTHREAD:

Code: Selecteer alles

      private void StatusPending()
      {
         do
         {
            this.statusBarPanel1.Text = "Bezig met sorteren";
            //this.statusBarPanel1.Text = "  " + sText;
            for(int i = 0; i < 10; i++)
            {
               Thread.Sleep(200);
               this.statusBarPanel1.Text += ".";
            }
         }
         while(!bIsDone);
      }


code voor de uitvoer van die statusprogress (thread.sleep) doe niks TIJDENS het uitvoeren van de Sorteermethode

Vraag3: Voor thread te maken moet ge nen delegate gebruiken maar die delegate mag in de delegate ThreadStart GEEN parameterlijst hebben, hoe kunde da oplossen dat da wel mag of hoe maakt ge iets aan dat ervoor zorgt da ge nen delegate met parameterlijst kunt gebruiken in iets dat geen parameterlijst heeft, kan gebruikt worden in ThreadStart maar geen parameterlijst heeft.
Andere klasse is geen optie :p ;)

Geplaatst: 18 nov 2004, 21:52
door khsw
De opbouw van uw GUI zit in de hoofdthread, dus als deze druk bezig is, kunnen de puntjes niet getoond worden.
Je kan dit oplossen door in je loop gebruik te maken van

Code: Selecteer alles

Application.DoEvents();
Dit vertraagt wel enigszins.


Ik heb het even uitgewerkt (heel beknopt) met DoEvents();

Code: Selecteer alles

private void button1_Click(object sender, System.EventArgs e)
      {
         progressBar1.Maximum = 5000;
         Random r = new Random();
         for (int i = 0; i < 5000; i++)
         {
            progressBar1.Value = i + 1;
            listBox1.Items.Add(r.Next(1,1000));
            Application.DoEvents();
         }
         progressBar1.Value = 0;
      }

      
      private void BubbleSort()
      {
         int k = 0;
         for (int i = 0; i < listBox1.Items.Count; i++)
         {
            for (int j = listBox1.Items.Count - 1; j > i; j--)
            {
               if (Convert.ToInt32(listBox1.Items[j-1]) > Convert.ToInt32(listBox1.Items[j]))
               {
                  k = Convert.ToInt32(listBox1.Items[j]);
                  listBox1.Items[j] = listBox1.Items[j-1];
                  listBox1.Items[j-1] = k;
                  Application.DoEvents();
               }
            }
            progressBar1.Value = i + 1;
         }
      }

      private void button2_Click(object sender, System.EventArgs e)
      {
         BubbleSort();
      }





Maak je gebruik van threading, dan zou ik het eerder omkeren:

Hoofdthread = Puntjes tonen
Backgroundthread = sorteren

Ik heb het ook even met threads uitgewerkt (wel wat simpelder dan jouw code, C# is niet zo mijn ding...)


Code: Selecteer alles

private void button1_Click(object sender, System.EventArgs e)
      {
         progressBar1.Maximum = 500;
         Random r = new Random();
         for (int i = 0; i < 500; i++)
         {
            progressBar1.Value = i + 1;
            listBox1.Items.Add(r.Next(1,1000));
            Application.DoEvents();
         }
         progressBar1.Value = 0;
      }

      
      private void BubbleSort()
      {
         int k = 0;
         for (int i = 0; i < listBox1.Items.Count; i++)
         {
            for (int j = listBox1.Items.Count - 1; j > i; j--)
            {
               if (Convert.ToInt32(listBox1.Items[j-1]) > Convert.ToInt32(listBox1.Items[j]))
               {
                  k = Convert.ToInt32(listBox1.Items[j]);
                  listBox1.Items[j] = listBox1.Items[j-1];
                  listBox1.Items[j-1] = k;
               }
            }
            progressBar1.Value = i + 1;
         }
      }

      private void button2_Click(object sender, System.EventArgs e)
      {
         ThreadStart ths = new ThreadStart(BubbleSort);
         Thread thr = new Thread(ths);
         thr.Start();

      }


Afbeelding

De source staat in attachment.

Geplaatst: 18 nov 2004, 22:28
door khsw
Meer info over threads en parameters vind je trouwens op http://www.yoda.arachsys.com/csharp/threadstart.html

Geplaatst: 18 nov 2004, 22:39
door DiViNO
heel erg bedankt khsw ! :)

Ik ga meteen je code eens bekijken en zien of ik er iets mee kan doen, normaal wel...;)

btw je blog staat al in men favorieten, ben nl ook een .NET addict :);)