Archief - Functies oproepen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Electica

Legacy Member
Hallo,

Ik ben in C# aan het leren programmeren en ik zit met een klein probleempje

Ik heb 2 functies 'This' en 'Another' deze worden opgeroepen wanneer ik in cmd het woord 'This' of het woord 'another' typ

De eerste toont 11 keer een zinnetje doordat ik een lus heb gemaakt in die functie met een threading.sleep ertussen dat het iets trager gaat
De andere doet het zelfde maar toont een andere boodschap.

De bedoeling van dat ik een Thread.sleep heb gebruikt is dat hij trager bezig is met zinnetjes te tonen zodat ik de ander functie kan oproepen terwijl de functie nog niet klaar is.
Hoe kan ik dit best oplossen?
Ik hoop dat mijn vraag een beetje duidelijk is :D
Momenteel begint hij met de functie wanneer hij klaar is met de eerste
Kan ik dit met events oplossen?
Ik weet wel niet echt hoe die werken, heb er al veel over opgezocht ook over delegates.
Ik weet wat het is maar zou het zelf niet kunnen toepassen op mijn eigen programma's (events)
Code:
using System;

using System.Threading;

namespace CommandoTest
{
    class CommandTest
    {
        static void Main(string[] args)
        {
            CommandTest c = new CommandTest();

            string Command = Console.ReadLine();
            while (Command != "stop")
            {
                switch (Command)
                {
                    case "this":
                        c.This(50);
                        break;
                    case "another":
                        c.Another(50);
                        break;

                    default:
                        Console.WriteLine("Wrong input!");
                        break;
                }
                Command = Console.ReadLine();
            }

            Console.Read();
        }


        private void This(int var)
        {
            while (var >= 0)
            {
                var -= 5;
                Thread.Sleep(100);
                Console.WriteLine("You've typed 'this'");

            }
        }
        public void Another(int var)
        {
            while (var <= 110)
            {
                var += 5;
                Thread.Sleep(100);
                Console.WriteLine("You've typed 'another'");

            }
        }

    }
}

Mercikes!

Fraggie

Legacy Member
Je moet er eens goed bij stilstaan. Als je Thread.Sleep(int ms); gebruikt, hoe weet het programma nu welke thread er moet wachten? In wezen heb je maar één thread in dat programma dus, is de oplossing om je programma multithreaded te maken.

In a nutshell:
- maak een nieuwe klasse aan die thread implementeerd, of wrap hem in een thread object
- in je main methode maak je per call van This of Another, een nieuw object aan van die klasse met de gewenste tekst als constructor parameter en start je ze
- elk van die objecten heeft zijn eigen thread en eigen Thread.Sleep(..) en gaat de data door elkaar uitspuwen.

Andere oplossingen zijn ook mogelijk.. ik neem aan dat je in C# een delegate kan meegeven naar de methode die je multithread wil uitvoeren. Dit zorgt voor minder code, maar lijkt me niet aan geraden voor een beginner.

Messias.

Legacy Member
Het is veel makkelijker om de TPL te gebruiken ipv manueel threads aan te maken.

Code:
Task.Factory.StartNew(() => c.This(50));

En je bent klaar. StartNew maakt een nieuwe Task op basis van de gegeven lambda-expressie. Vervolgens wordt die Task achter de schermen gescheduled en asynchroon uitgevoerd.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan