[.NET C#] pauze inbouwen

Pagina: 1
Acties:
  • 146 views sinds 30-01-2008
  • Reageer

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18:21
hallo,

ik heb me al gezocht in MSDN en GoT naar een sleep/pauze in C#. ik kan het alleen voor threadsvinden. maar ik wil namelijk het volgende zodat het onbruikbaar wordt.

ik heb een functie die data naar een ander programma stuurt en het programma mag niet verder voordat is klaar het met de bewerking. nu kun je dat checken door de functie if( programma.isrouting == true / false) uit te voeren. maar als ik dat in een while zet om te kijken wanneer die klaar is. loopt dat ding helemaal vast, want het programma kan de hoeveelheid request niet aan. dus heb ik de while een pauze/sleep in gebouwd. maar deze gebruikt gigantisch veel overhead.

private void sleep(double time)
{
DateTime huidigetijd= new DateTime();
huidigetijd = System.DateTime.Now;
huidigetijd = huidigetijd.AddMilliseconds(time);
while(huidigetijd.TimeOfDay > System.DateTime.Now.TimeOfDay)
{
}

}

dit is de functie. weet iemand hoe ik het beter kan maken. ;)

Klaas


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Jou funtcie freet 100% CPU...

C#:
1
2
3
4
private void sleep(double time)
{
   System.Threading.Thread.CurrentThread.Sleep(time);
}

[ Voor 8% gewijzigd door pjvandesande op 08-10-2004 09:15 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
Een pause kan je inbouwen door:
code:
1
System.Threading.Thread.Sleep ( xxxx );

Hiermee stopt de huidige thread voor xxxx aantal milliseconden.

https://fgheysels.github.io/


Verwijderd

Probeer eens in je while een Thread.Sleep(1000) te zetten.
Da zal ie 1 seconde wachten en zal ie de processor niet 100% belasten.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

whoami schreef op 08 oktober 2004 @ 09:14:
Een pause kan je inbouwen door:
code:
1
System.Threading.Thread.Sleep ( xxxx );

Hiermee stopt de huidige thread voor xxxx aantal milliseconden.
Je vergeet de Current Thread eerst te verkrijgen B)
Verwijderd schreef op 08 oktober 2004 @ 09:14:
Probeer eens in je while een Thread.Sleep(1000) te zetten.
Da zal ie 1 seconde wachten en zal ie de processor niet 100% belasten.
Kun je beter gelijk gewoon een sleep doen voor een bepaalde tijd. :?

[ Voor 36% gewijzigd door pjvandesande op 08-10-2004 09:17 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
questa schreef op 08 oktober 2004 @ 09:16:
[...]

Je vergeet de Current Thread eerst te verkrijgen B)


[...]


Kun je beter gelijk gewoon een sleep doen voor een bepaalde tijd. :?
Bah, een detail. :+

https://fgheysels.github.io/


  • gill
  • Registratie: Januari 2002
  • Laatst online: 26-12-2025

gill

Love my lindsey...

Ik dacht ook met Thread.CurrentThread.Sleep, maar
ik kan het alleen voor threadsvinden
TS wil dit blijkbaar niet.

Visit my new Blog!
www.Snowball.be


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
Het is CurrentThread.Sleep.
De huidige thread wordt daardoor ff te slapen gelegd. Dit heeft niet noodzakelijk met 'multi-threading' te maken zoals jij en de TS denken; je programma loopt zowiezo in een thread.

https://fgheysels.github.io/


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18:21
hey allemaal

het werk met

System.Threading.Thread.Sleep(ms);


het vreet inderdaad minder processorkracht. nu kan het programma ook es draaien op een 1 Ghz comp ipv een 3.0 Ghz

8)7 8)7

Klaas


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

klaasopurk schreef op 08 oktober 2004 @ 09:11:
[...]
ik heb een functie die data naar een ander programma stuurt en het programma mag niet verder voordat is klaar het met de bewerking. nu kun je dat checken door de functie if( programma.isrouting == true / false) uit te voeren. maar als ik dat in een while zet om te kijken wanneer die klaar is. loopt dat ding helemaal vast, want het programma kan de hoeveelheid request niet aan. dus heb ik de while een pauze/sleep in gebouwd. maar deze gebruikt gigantisch veel overhead.
[...]
Kan je die While-loop met de .isRouting erin niet in een aparte thread laten draaien? Dan loopt de rest van je programma door. Zorg er vervolgens voor dat je pas wat mag doen als de while-lus doorlopen is (dus voor de while een variable Bezig=true en na de while op false, zodat de rest van de applicatie ziet dat je in de while zit).

En zorg dat je maar één thread tegelijk door de while laat gaan (dus de thread niet lokaal aanmaken, want dan wordt het een zootje).

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Ik zou het sowieso in een appatre thread laten draaien zo iets ja.

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18:21
Chief.NET schreef op 08 oktober 2004 @ 09:35:
[...]

Kan je die While-loop met de .isRouting erin niet in een aparte thread laten draaien? Dan loopt de rest van je programma door. Zorg er vervolgens voor dat je pas wat mag doen als de while-lus doorlopen is (dus voor de while een variable Bezig=true en na de while op false, zodat de rest van de applicatie ziet dat je in de while zit).

En zorg dat je maar één thread tegelijk door de while laat gaan (dus de thread niet lokaal aanmaken, want dan wordt het een zootje).
ik zou het wel willen, ware het niet dat ik absolute niks verder kan doen eer dat het andere programma klaar is met zijn bewerking. dus om dan een thread te laten lopen en mijn eigen programma door loopt is niet zo succesvol. hooguit dat de interface ook refreshed als je het verplaatst.

maar een klein voorbeeldje mag je wel sturen. ik kan het proberen, want ik begrijp nog niet hoe je dit ziet.

Klaas


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 08 oktober 2004 @ 09:25:
Het is CurrentThread.Sleep.
De huidige thread wordt daardoor ff te slapen gelegd. Dit heeft niet noodzakelijk met 'multi-threading' te maken zoals jij en de TS denken; je programma loopt zowiezo in een thread.
Thread.Sleep( ... ) werkt ook automatisch op de CurrentThread. Het is namelijk een static method ( Die ongetwijfeld intern weer Thread.CurrentThread aanroept ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18:21
rwb schreef op 08 oktober 2004 @ 09:56:
[...]


Thread.Sleep( ... ) werkt ook automatisch op de CurrentThread. Het is namelijk een static method ( Die ongetwijfeld intern weer Thread.CurrentThread aanroept ).
hier heb je gelijk in. De andere manier werkte idd niet. Hij zei dat het een static methode was. de Thread.Sleep() doet het wel ja. zie ook eerdere post.

Klaas


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

klaasopurk schreef op 08 oktober 2004 @ 09:49:
[...]
maar een klein voorbeeldje mag je wel sturen. ik kan het proberen, want ik begrijp nog niet hoe je dit ziet.
Het wordt wel VB.NET (heb geen zin om het om te schrijven :P )

Declareer een thread in een class:
Visual Basic:
1
    Private _threadRx As Thread


De functie die de thread aanroept (die je aanroept om te doen wat je wil doen)
Visual Basic:
2
3
4
5
6
7
8
9
10
11
    Public Overrides Sub Receive()
        If Not _receiving Then
            If Not Me._threadRx Is Nothing Then
                _threadRx.Abort()
            End If
            _threadRx = New Thread(AddressOf _Receive)

            _threadRx.Start()
        End If
    End Sub


De functie die werkelijk je while-lus doet.. die is dus in de aparte thread:
Visual Basic:
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    Private Sub _Receive()
        _receiving = True

        Try
            While ....
                  '......
            End While
        Catch e As Exception 
               'of nauwkeuriger natuurlijk 
               '(zie een topic ergens op PW)
        End Try

        Me.OnMessageReceived(message) 
                'Dit is een sub die een event geeft 
                'dat er wat ontvangen is (in mijn geval)
                'let op in welke thread je nog zit he..
        _receiving = False
    End Sub


Het _receiving-systeem is niet waterdicht, want er bestaat een kans dat _Receive wordt aangeroepen en dat er een nieuwe Receive direct erna wordt aangeroepen (terwijl _receiving nog laag is). Die kans is heeeel klein, maar wordt ondervangen door de Abort..

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
klaasopurk schreef op 08 oktober 2004 @ 09:49:
[...]


maar een klein voorbeeldje mag je wel sturen. ik kan het proberen, want ik begrijp nog niet hoe je dit ziet.
Je kan dit doen dmv de Join method.

code:
1
2
3
myThread.Start();
myThread.Join();
// continue with the main program...

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

whoami schreef op 08 oktober 2004 @ 10:25:
[...]


Je kan dit doen dmv de Join method.

code:
1
2
3
myThread.Start();
myThread.Join();
// continue with the main program...
Dan blok je nog je current thread toch, dus blocked alles alsnog.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
Nope:
test dit ff:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void Run()
{
    _t = new Thread (new ThreadStart(DoWork));
    Console.WriteLine ("Thread starting.");
    _t.Start();
    _t.Join();
    Console.WriteLine ("Continue main-thread.");
    Console.ReadLine();
}
        
private void DoWork( )
{
    int i = 0;
    while ( i < 10 )
    {
        Console.WriteLine ("working... " + i.ToString());
        System.Threading.Thread.Sleep (100);
        i++;
    }
    Console.WriteLine ("thread finished.");
}


Doe eens een testje met deze code, en doe ook eens een test met de Join uitgecomment.

https://fgheysels.github.io/


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

whoami schreef op 08 oktober 2004 @ 10:33:
Nope:
test dit ff:

[...]

Doe eens een testje met deze code, en doe ook eens een test met de Join uitgecomment.
Dan blokkeer je tóch de currentthread?. Run blijft wachten totdat de andere thread klaar is. (Ik heb het net getest)
Als je de Join weghaalt, lopen de threads "naast elkaar".

Ik ga het nog even wat sterker stellen:
Als je een Start en een Join achter elkaar zet (van dezelfde thread B) ), dan kan je net zo goed de hele thread weglaten en direct de functie aanroepen.

[ Voor 6% gewijzigd door MrSleeves op 08-10-2004 10:54 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Rolgordijn
  • Registratie: Januari 2000
  • Laatst online: 30-06-2022
Je zou er ook voor kunnen kiezen om de operatie asynchroon te verwerken. Kijk voor een voorbeeldje eens naar MSDN - IAsyncResult Interface. Het zou mijns inziens een stuk netter zijn dan een Thread.Sleep :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-05 23:34
Chief.NET schreef op 08 oktober 2004 @ 10:44:
[...]


Dan blokkeer je tóch de currentthread?. Run blijft wachten totdat de andere thread klaar is. (Ik heb het net getest)
Als je de Join weghaalt, lopen de threads "naast elkaar".

Ik ga het nog even wat sterker stellen:
Als je een Start en een Join achter elkaar zet (van dezelfde thread B) ), dan kan je net zo goed de hele thread weglaten en direct de functie aanroepen.
Idd, maar dat is toch wat de TS wou? Pas verder gaan met het programma als die thread beeindigd is?

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Chief.NET schreef op 08 oktober 2004 @ 10:44:
Als je een Start en een Join achter elkaar zet (van dezelfde thread B) ), dan kan je net zo goed de hele thread weglaten en direct de functie aanroepen.
Dit bedoelde ik ook. O+

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

whoami schreef op 08 oktober 2004 @ 11:03:
[...]

Idd, maar dat is toch wat de TS wou? Pas verder gaan met het programma als die thread beeindigd is?
Ja, maar dan neem je de overhead niet weg.
Je neemt een thread, omdat je de "zware last" van een bepaalde subroutine niet bij de mainthread in z'n schoenen wilt schuiven. Als iets er lang over doet, neem je een Thread die apart draait, zodat de rest van de applicatie niet hangt..
Maar dat weet jij wel. :P Je bent gewoon eigenwijs ;) .

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 18:21
hoi allemaal

ik denk dat ik het volgende nu ga doen

-thread maken die de hele methode in zich heeft
-zorgen dat er niet 2 x keer op de knop gedrukt kan worden
-de rest van programma normaal kunnen afhandelen, maar niet zomaar formulier afsluiten

thanks for everything _/-\o_

Klaas


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

klaasopurk schreef op 11 oktober 2004 @ 11:20:
hoi allemaal

ik denk dat ik het volgende nu ga doen

-thread maken die de hele methode in zich heeft
-zorgen dat er niet 2 x keer op de knop gedrukt kan worden
-de rest van programma normaal kunnen afhandelen, maar niet zomaar formulier afsluiten

thanks for everything _/-\o_
Ik mis de progressbar nog O-)
Pagina: 1