Avatar billede glenn007 Nybegynder
29. januar 2009 - 02:45 Der er 10 kommentarer

vente på tilstand og eksecute sit indhold

har sat to funktioner igang samtidigt og de er hverisær forskilligt tid om at blive færdige.

funk1();
og funk2();

de retunere begge en true tilstand når de er færdige hver i sær.

har en anden funktionen der skal kunne overvåge og vente med at gøre noget før BEGGE disse funktioner er true

dvs når funk_a er sand og funk_b er sand skal den afvikle noget kode.

men hvordan for jeg den til at vente så den tit kontrollere om disse er færdige uden det kræver en timer der kører som en gal.

hvad er den mest praktiske måde at udføre denne type aktivitet på. nogen forslag
Avatar billede arne_v Ekspert
29. januar 2009 - 02:50 #1
Hvis du kører funk1 og funk2 i tråde, så skal den tredie funktion bare kalde Join på de
to tråde, så venter den til de er færdige.

// start t1 og t2
t1.Start();
t2.Start();
// vent på de er færdige
t1.Join();
t2.Join();
Avatar billede glenn007 Nybegynder
29. januar 2009 - 03:09 #2
det gør jeg desværre ikke tror jeg.

har  bare min

public void funk1()

{koden }

public void funk2()

{koden }



er det nemt at lave om til "tråde"  jeg er hell blankt med den slags endnu
Avatar billede arne_v Ekspert
29. januar 2009 - 03:15 #3
Hvordan kan de køre samtidigt hvis de ikke er i tråde ??
Avatar billede glenn007 Nybegynder
29. januar 2009 - 03:19 #4
ok måske kører de ikke HELT samtidigt, kalder dem i en anden funktion

således

startnoget()
{

funk1();
funk2();

}
Avatar billede glenn007 Nybegynder
29. januar 2009 - 03:28 #5
hmm  fandt noget der kan hjælpe mig lidt igang

public static Thread funk1;
public static Thread funk2;


funk1 = new Thread(new ThreadStart(funk1));
funk2 = new Thread(new ThreadStart(funk2));


er det sådan man kan definer det er en tråd ? og så har man så sin sædvanlige  public void funk1()
{......}
public void funk2()
{......}

og så som du siger

// start t1 og t2
funk1.Start();
funk2.Start();
// vent på de er færdige
funk11.Join();
funk2.Join();
Avatar billede arne_v Ekspert
29. januar 2009 - 04:03 #6
Ja.

Med din oprindelige kode er startnoget færdig når funk1 og funk2 er færdige.
Avatar billede glenn007 Nybegynder
29. januar 2009 - 11:35 #7
hvad mangler jeg mon.

sådan ser min kode ud indtil viderer ellers

// definering
public static Thread funk1;
public static Thread funk2;


// tildelling af værdier
funk1 = new Thread(new ThreadStart(funk1));
funk2 = new Thread(new ThreadStart(funk2));


og så der ballade her... den vil ikke lade mig lave disse to som jeg jo ville have min kode i den skal eksecute... den siger funk1 allerede er der og referrerer til denne linie ( det samme gælder funk2 )

funk1 = new Thread(new ThreadStart(funk1));

// funktioner
        public static void funk1()
        {
// gør noget
bool funk1ready = true;
        }

        public static void funk2()
        {
// gør noget andet
bool funk2ready = true;
        }




har putte dette in i den funktion som skal vente
// indsamling af data til behandling
public void startnoget()
{

funk1();
funk2();

if (funk1ready&&funk2ready)
// Afspiller lille lyd når funktionerne er indlæst og de kan bruges til andre funktioner.

}
Avatar billede glenn007 Nybegynder
29. januar 2009 - 11:44 #8
måske du kan forklare lidt om hvad join gør i forhold til hvis jeg havde gjort således.

startnoget()
{
kode1(); // ikke threads
kode2(); // ikke en thread
et tons if sætnigner her

}

og hvis man gør med join og threads hvad er så forskellen på disse to måder at afvikle på i tid og power og flexibilitet osv. hvis man kan sige noget om det kort.

startnoget()
{
kode1.start(); // bruger threads
kode2.start(); // bruger threads
et tons if sætnigner her

}
Avatar billede kamak Praktikant
29. januar 2009 - 17:04 #9
I dit første eksempel bliver kode1() og kode2() sekventielt altså efter hinanden. Først uudføres kode1() og når kode1() er helt færdig udføres kode2(). Hvis du derimod bruger tråder udføres kode1() og kode2() samtidig.
Så, som arne_v bemærkede før, så er kode1() færdig når kode2() er færdig i dit oprindelige eksempel. Kode2() udføres jo efter kode1() er færdig.
Avatar billede arne_v Ekspert
30. januar 2009 - 03:09 #10
Almindelige kald afvikles sekventielt.

Tråde afvikles parallelt.

På en single core CPU afvikles tråde ved at skiftes til at bruge CPU'en.

På multi core CPU kan trådene køre på hver sin core ægte parallelt.

Så hvis trådene enten laver blocking reads eller bruger meget CPU power så afvikles
det hele hurtigere ved at køre det i tråde.

Der er dog lidt overhead, så trådene skal lave en del arbejde førend det kan betale
sig at starte tråde.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester