Toon posts:

[C#] thread synchronisatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
In borland C++ heb ik ooit een multi-threaded programma geschreven waarbij een aantal child-threads stukjes uitvoeren en de resultaten naar het hoofdformulier sturen. Bij Borland C++ heette deze functie Synchronize().

Nu ben ik in C# zo'n zelfde iets aan het maken... maar kan geen functie vinden zoals Synchronize. Op dit moment heb ik als thread functie:
code:
1
2
3
4
5
6
7
8
9
10
        private void myThreadStart()
        {
            while (true)
            {
                WaitHandle.WaitAll(this.myEvent);

                ThreadPool.QueueUserWorkItem(this.pres.CallBackPhotoSlide);
                this.myEvent[0].Reset();
            }
        }


Wanneer nu de functie CallBackPhotoSlide wordt aangeroepen voert de hoofdthread dit uit in plaats van dat deze gewoon doorloopt en de child-thread dit doet. Wat doe ik hier fout?!

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 17:29

Exirion

Gadgetfetisjist

http://www.google.nl/sear...&btnG=Google+zoeken&meta=

Eerste hit is al documentatie van Microsoft :{

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


Verwijderd

Topicstarter
Dit was niet wat ik bedoelde... hierbij lock je een stuk geheugen of variabelen zodat niet twee verschillende threads op hetzelfde tijdstip deze tegelijk of overlappend proberen te benaderen. In Borland C++ zijn dit de TCriticalSections.

Het probleem wat ik heb zit meer in dat de hoofdthread 'stopt' op het moment dat de genoemde functie aangeroepen wordt. Het ziet er voor mij uit dat de hoofdthread deze functie gewoon zelf uitvoert in plaats van dat de child-thread dit doet. Het hele nut van een losse thread verdwijnt dan zo'n beetje |:( .

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

je start een thread
binnen die thread geef je je werklast door aan de threadpool die dus nog een andere thread de taak laat uitvoeren...

misschien moet je toch even gaan lezen over threading.

[ Voor 12% gewijzigd door H!GHGuY op 12-05-2006 22:07 ]

ASSUME makes an ASS out of U and ME


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:46
Je bedoelt dat je een thread hebt, die een taak uitvoert, en de 'voortgang' van die taak moet naar je form (UI thread) getoond worden, bv, dmv een progress-bar die moet ge-updated worden ?

https://fgheysels.github.io/


Verwijderd

Zoek 's in de online help naar AutoResetEvent, ManualResetEvent, BackgroundWorker, etc.

Ik geef toe, t.o.v. Synchronize en TCriticalSection uit de Borland omgeving zijn ze een stuk omslachtiger te gebruiken, maar ze geven je wel de mogelijkheid om bv. van een threadpool te gebruik te maken. En da's toch ook wel heel erg prettig en krachtig van .NET...

/me probeert zich vanuit een Delphi achtergrond .NET eigen te maken, en snapt de frustratie helemaal.

Edit:
Highguy heeft helemaal gelijk, denk ik: het is zinloos om in je ThreadStart een nieuw item in je ThreadPool te gooien. Je thread draait dan nl. al, en kan 't dan beter zelf even uitvoeren. Vanuit een thread iets in de ThreadPool gooien lijkt me niet slim... (maar ik ben ook nog .NET beginner, en leer ook nog continue bij)

[ Voor 28% gewijzigd door Verwijderd op 13-05-2006 02:42 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:46
Sterker zelfs, hij blijft oneinidg veel threads queuen; die QueuUserWorkItem staat in een oneindige loop.

https://fgheysels.github.io/


Verwijderd

Gezien de naam "CallBackPhotoSlide" is de Timer class misschien meer wat je zoekt.

Als je inderdaad een of andere diashow bent aan het maken, dan zou je de timer z'n event 30x per seconden kunnen later firen (als je bewegend beeld wilt) en in de eventhandler de coordinaten van je plaatje kunnen aanpassen, gevolgd door een Invalidate() van het form waar je op rendert. Als je gewoon af en toe een andere foto wilt weergeven, dan kun je ook een Timer gebruiken, maar met een groter interval van een paar seconden en dan in de eventhandler het plaatje updaten.

Hoop dat je hier wat aan hebt, het blijft een beetje gokken omdat we niet weten wat je nou wilt doen :)

[ Voor 3% gewijzigd door Verwijderd op 13-05-2006 10:46 ]


Verwijderd

Topicstarter
Het volgende wat ik precies zou willen is het volgende:

ik heb een programma lopen met een news ticker en een news scroll bericht.
Dit werkt allemaal goed en werkt met timers in het hoofdprogramma. (Misschien moet dit later ook op een andere manier, maar daar ben ik nu nog niet uit)

Nu heb ik een photoslide box waarin foto's van elkaar wisselen. Wanneer hij nuy een foto gaat wisselen gaat de ticker en news een stuk langzamen lopen omdat ook het foto wisselen via het hoofdprogramma gaat.
Graag zou ik zien dat alles goed blijft lopen en het foto wisselen en in een andere trhead draait.
Het foto wisselen gaat met een fade out en in, daarom wat trager.

Daarom ben ik gaan proberen dit in een andere thread te starten.

Verwijderd

Simpel thread voorbeeldje, zonder threadpool, delegates, mutexes, waithandles, etc.
Misschien heb je er wat aan...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Threading;

namespace SimpelDraadje {

  public class PlaatjeHaler {

    public void HaalPlaatje() {
      Console.WriteLine("Plaatje halen...");
      for (int i = 0; i < 50; i++) {
        Console.WriteLine("druk");
        Thread.Sleep(100);
      }
      Program.PlaatjeIsKlaar();
    }
  }

  public class Program {

    [STAThread]
    static void Main(string[] args) {
      PlaatjeHaler job = new PlaatjeHaler();
      Thread plaatjeHaalThread = new Thread(new ThreadStart(job.HaalPlaatje));
      Console.WriteLine("Mainthread gaat andere dingen doen...");
      plaatjeHaalThread.Start();
      for (int i = 0; i <= 70; i++) {
        Console.WriteLine("... ander ding {0}", i);
        Thread.Sleep(100);
      }
    }

    public static void PlaatjeIsKlaar() {
      Console.WriteLine("Plaatje is klaar!");
    }
  }
}


Edit: blijkbaar is [code=c#] stuk? 5 x geprobeerd te posten, en steeds een timeout. Dus dan maar gewoon met [code]...

[ Voor 105% gewijzigd door Verwijderd op 13-05-2006 22:48 ]

Pagina: 1