/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Tråde og Lister Samtidig
Fra : lars09
Vist : 538 gange
100 point
Dato : 24-04-04 11:16

Hej!

Nu er jeg løbet ind i et nyt problem, hvis jeg ønsker at mine tråde skal være lokale funktioner, skal trådene være static funktion, samt alle andre funktioner som kaldes, skal være static.

Problemet er så at jeg gerne vil have den en liste i en af disse funktioner, hvordan gør jeg dette ???

Der ligger et eksempel på programmet, med 2 tråde og en liste, listen virker hvis trådene er globale.
www.testpilot.dk/c++/protokol.rar

Håber der er nogen som har en løsning

 
 
Kommentar
Fra : BertelBrander


Dato : 24-04-04 13:14

Det klassiske metode er at give thread-funktionen en pointer til det object der ejer tråden med som parameter. I dit tilfælde gøres det ved at ændre start af sende tråden til:

pSendThread = AfxBeginThread(SendThread, (LPVOID )this);

I sende tråden konverterer man parameteren tilbage til en CDataLinkLayer *:

UINT CDataLinkLayer::SendThread(LPVOID Param)
{
CDataLinkLayer *Owner = (CDataLinkLayer *)Param;

Så kan du tilgå member variabler og metoder igennem denne pointer:

Owner->pPacket = new CPacket();
Owner->m_pSendlist.AddHead(pPacket);

Du skal så lige bestemme dig for hvilke variable der skal deles mellem tråde. Det kan give mange problemer hvis flere tråde ændrer på den samme variabel samtidig. Det er normalt pænere at sende en besked til den tråd der ejer variablen, så der kun er en tråd der tilgår variablen.
Eller du kan beskytte de variable der skal deles med en mutex.

Kommentar
Fra : BertelBrander


Dato : 24-04-04 16:12

Du kan også lave en static tread entry function der blot kalder en ikke static function hvor selve koden ligger, så slipper du for at bruger Owner->m_var hele tiden:

pSendThread = AfxBeginThread(SendThreadEntry, (LPVOID )this);

I sende tråden konverterer man parameteren tilbage til en CDataLinkLayer *:

UINT CDataLinkLayer::SendThreadEntry(LPVOID Param)
{
CDataLinkLayer *Owner = (CDataLinkLayer *)Param;
Owner->SendThread();
return 0,
}

void CDataLinkLayer::SendThread()
{
// Send thread er nu en ikke static function
}

Kommentar
Fra : BertelBrander


Dato : 24-04-04 16:15

En helt anden metore, der kan bruges hvis du er sikker på at der altid kun vil være en instans af den class der ejer tråden, er at lave en static member variabel der peger på denne instans (sættes inden du opretter tråden) tråden kan så tilgå class'ens ikke static variable og functioner gennem denne pointer.

Kommentar
Fra : lars09


Dato : 24-04-04 19:10

Ja det er meget godt, men kan jeg så skrive til min liste, når jeg har tråde som i din anden kommentar ??? Så vidt jeg forstår det, så skal SendThreadEntry(LPVOID param) være en static funktion!!!

Det er nemlig vigtigt at jeg kan skrive til listen idet at jeg skal bruge de data som ligger i den senere!

Kommentar
Fra : BertelBrander


Dato : 24-04-04 23:14

I kommentaren fra 24-04-04 16:12, skal SendThreadEntry(), være en static function og SendThread skal være en ikke-static function, derved kan du tilgå alle member variable (inklusive din liste) og functioner i class'en fra SendThread() som i alle andre ikke static member-functioner.

Accepteret svar
Fra : BertelBrander

Modtaget 100 point
Dato : 24-04-04 23:42

Jeg har lagt en version af datalinklayer.* her:

http://home20.inet.tele.dk/midgaard/datalinklayer.zip

Disse er rettet så der bruges metoden fra 24-04-04 16:12, både med sende og modtage tråden.

Godkendelse af svar
Fra : lars09


Dato : 25-04-04 10:10

Jeg siger mange tak! endnu en gang! :)            

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste