26. maj 2005 - 07:05Der er
46 kommentarer og 1 løsning
Hvordan overfører man en instans til en tråd?
Jeg har en instans af en klasse, som jeg ønsker skal være tilgængelig i hver eneste tråd, der oprettes, men hvordan får jeg den ført med over til de nye tråde?
Kan du give et hurtigt eksempel på, hvordan jeg bedst opbygger structen, overfører den og aflæser dens variabler i serveClient()? Jeg er desuden i tvivl om, hvordan mutex bruges, så det må du også gerne uddybe, hvis du har tid.
Det virker fint, når den første klient forbinder sig, men når de næste klienter kommer på, udskrives new_fd ikke længere. Det ser ud som om, at klienterne på en eller anden måde får delt den samme file descriptor. For jeg kan nemlig lige få lov at skrive en enkelt kommando fra de næste klienter, inden de går ned, men resultatet bliver så vist hos den første klient, så vidt jeg kan se.
Det går jeg ikke ud fra, idet instansen er structen kun skulle blive erklæret én gang for alle og herefter overført til hver tråd, der skabes. Jeg skal skynde mig at sige, at jeg her ikke benytter mutex, da jeg ikke helt kunne gennemskue, hvordan det skulle laves. Så måske er det problemet?
Nu kan der i hvertfald godt komme flere klienter på. De får hver deres fd.
Men problemet med "cst" må jo være, at jeg ikke kan tilgå værdien af variablen i "ctrlstats" for den forrige tråd, når jeg opretter en ny instans med "thd = new thread_info;" for hver tråd.
Det ser ud til at virke perfekt nu. Så jeg siger tak for din tålmodighed.
Har dog et mere generelt spørgsmål om server-clients. Hvis du har tid og lyst, kan du få nogle flere points. Under alle omstændigheder må du gerne lægge et svar.
Tak. Jeg laver en simpel stastistik over antal klienter, der er tilsluttet. Det er bl.a. det, som jeg bruger klassen "ctrlstats" til. Jeg tæller én op lige efter accept()-kaldet, og det går fint. Men jeg kan ikke få talt ned, når en klient afbryder forbindelsen (fx ved at lukke prompt-vinduet).
I "void * serveClient (void * thd)" har jeg en uendelig løkke, hvori der kaldes en receive-funktion, som modtager data fra klienten. Mit bedste bud var at fratrække antallet én lige efter denne løkke, men det fungerer ikke. Desuden lukkes serveren ned, hvis en klient lukkes, og det er jo ikke ligefrem smart.
Kan du sige noget generelt om, hvad der er smartest at gøre hvor?
Ja, jeg har lavet et tjek på recv, og det løser begge problemer.
Mange tak for hjælpen.
Synes godt om
Ny brugerNybegynder
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.