Avatar billede nielsenmathias Nybegynder
24. januar 2005 - 09:12 Der er 4 kommentarer og
1 løsning

Tråd programmering, konceptuelt spørgsmål

Hejsa.

Jeg har et tråd objekt , T1, der lytter på en buffer. Denne buffer består af en modtage kanal samt en sende kanal, og er blot to fifoer der skal simulere en hardware-buffer med to kanaler.
I den anden ende af systemet har jeg endnu en tråd, T2, der henter og sender data over netværk via en socket forbindelse.
Imellem disse to tråde har jeg et static klasse CC, der kender de to nævnte tråde.
Situationen ser således ud:
rx/tx buffer  <-> T1 (tråd) <-> CC (static) <-> T2 (tråd) <-> network

Når T2 modtager data kalder den en metode i CC og sender en pointer til den modtagne data med. CC behandler denne data og skal nu sende en besked (eller data) til bufferen. Kan dette gøres gennem tråden T1? sagt på en anden måde, kan CC kalde en metode i T1 (som jo er en tråd med sit eget liv), uden at dette konceptuelt er forkert?
Man kan sikkert sagtens men er dette godt design? sætter pris på lidt input :)
ps. overvejer at sætte endnu en fifo mellem T1 og CC. så kan T1 lytte på bufferen og fifoen på skift. Dette er pænt, men vil også gøre det hele noget langsommere....
input tak :)
Avatar billede jakoba Nybegynder
24. januar 2005 - 17:52 #1
det kan du godt.

lav 2 funktioner i din statiske klasse, en son T2 bruger til at lægge data, og en som T1 bruger til at hente data.

Du skal så også sørge for at de to tråde ikke roder rundt i de data samtidig med hinanden, det kan fx gøres med en semafor:

static class S {

private bool semafor = false;  // false betyder 'klar til at modtage data'
                                    // true  betyder 'klar til at afgive data'
private int    data1;
private float  data2:
// osv    de data der skal overføres

boolean indsætData( int data1, int data2, ... ) {  // må kun kaldes af T2
    while( semafor ) {  // data kan ikke indsættes nu
        wait( 30 );    // vent på at T1 kommer og tømmer
    }
    // nu ved vi det er OK at indsætte data
    S.data1 = data1
    S.data2 = data2
    // osv
    semafor = true;        // nu har jeg indsat data
}

ArrayList hentData() {
    while( !semafor ) {  // data kan ikke henttes nu
        wait( 30 );    // vent på at T2 kommer og fylder
    }
    ArrayList resultat = new ArrayList()
    resultat.add( New Integer( S.data1 ) );
    resuktat.add( New Float( S.data2 ) );
    // osv
    semafor = true;          // nu har jeg hentet data.
}

mvh JakobA
Avatar billede jakoba Nybegynder
24. januar 2005 - 17:54 #2
Ups. sidste linie i hentData skal da være
    semafor = false;        // nu har jeg hentet data.
Avatar billede nielsenmathias Nybegynder
25. januar 2005 - 11:00 #3
ok ja smart nok. I Den løsning du har lavet her, er det tråden T1 der henter fra CC. Mit spørgsmål var faktisk om det omvendte var tilladt konceptuelt, eller om det er dårlig programmering?
situationen er altså : T1 bruger sit liv på at viderensende data fra buffer til CC. Men når CC modtager data fra T2 bruger den en metode i T1 til at tilføje data til bufferen. Så behøver de ikke at "mødes" ligesom du har foreslået eller mit ps antydede. mit ps og din løsning er jo i teorien samme tankegang, og det ville bare passe mig bedst at undgå dette...
Avatar billede nielsenmathias Nybegynder
25. januar 2005 - 11:02 #4
tak for kommentaren iøvrigt. jeg er ikke specielt ude efter kode, så¨det behøver i ikke at besvære jer med...kun ude efter et svar på et sikkert dumt spørgsmål.
Er det dårlig programmering? (for det kan jo sagtens lade sig gøre :)
Avatar billede nielsenmathias Nybegynder
03. februar 2005 - 10:25 #5
!
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
Kurser inden for grundlæggende programmering

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