Gå til innhold

Half Life 2 mod, tråder i C++


Anbefalte innlegg

Hei, jeg holder på med en Half-Life 2 mod der kildekoden til Source-spillmotoren er skrevet i C++. Jeg har ikke veldig mye erfaring med C++ og søker derfor etter hjelp.

 

Tanken er at en liten del av moden min skal kjøre I en egen tråd fordi den skal motta strings over et eget nettverk som jeg har satt opp selv ved hjelp av sockets i C++. Source har en fin tutorial for akkurat dette: LINK

 

Problemet ligger i det at koden til implementasjon av tråder ikke er objektorientert. Jeg må definere metoden "MyThread" som et medlem av klassen min, fordi jeg må sende en referanse(this) over til socket-klienten, slik at den kan kalle på en metode i klassen der det skrives ut beskjeder in-game.

 

Jeg er på utkikk etter noen som kan avansert C++ programmering og som er villig til å sette seg inn i dette og prøve å få til det (mot en pengesum kanskje?).

 

Prøvde å få hjelp på Steam forumet angående trådprogrammering, men fikk ikke noe hjelp der. Utviklerne kan ikke hjelpe til =/

 

Hvis noen er interessert, send en PM.

Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+9871234

Problemet ligger i det at koden til implementasjon av tråder ikke er objektorientert. Jeg må definere metoden "MyThread" som et medlem av klassen min, fordi jeg må sende en referanse(this) over til socket-klienten, slik at den kan kalle på en metode i klassen der det skrives ut beskjeder in-game.

Den enkleste metoden å betrakte en klasse på er som en kontainer av tilstander (variable eller attributter om du foretrekker de ordene) og metoder (funksjoner om du vil). Du kan altså betrakte en klasse som en kontainer av ditt prosedyre baserte program. Den store forskjellen på prosedyre og objekt orientert programmering er, at det første konseptet som navnet tilsier, fokuserer på prosedyrer, mens det andre fokuserer på tilstander - simulering av virkeligheten.

 

Interessant blir det når objekter kommuniserer med hverandre. Der står nesten ingen ting om multithreading i de bøkene jeg har av Strostrup, språkets utvikler. Men der finnes bøker som omhandler multithreading relativt grundig. Jeg anbefaler deg å skaffe den eldste nedenfor om du ikke har tid til å vente på den nyeste:

 

Ny som kommer i 2011:

 

http://www.amazon.com/C-Concurrency-Action-Practical-Multithreading/dp/1933988770/

 

En eldre mer kjent (klassiker om mutithreading?)

 

http://www.amazon.com/exec/obidos/ASIN/0072255129/

 

Innholdsfortegnelse (med 50 sider om multithreading):

 

http://www.amazon.com/exec/obidos/ASIN/0072255129/develshedinc-20/104-9100181-4527114?_encoding=UTF8&camp=1789&link_code=xm2#reader_0072255129

 

Kanskje litt kjipt å nevne to bøker, men jeg har mine egne ca 50 siter å ta vare på.

 

Google:

 

multithreading C++

 

En av de første treffene (fra den renomerte siten devarticles)

 

http://www.devarticles.com/c/a/Cplusplus/Multithreading-in-C/

 

har nettopp en referanse til den andre boken ovenfor.

 

Multithreading is growing in importance in modern programming for a variety of reasons, not the least of which being that Windows supports multithreading. While C++ does not feature built-in support for multithreading, it can be used to created multithreaded programs, which is the subject of this article. It is taken from chapter three of The Art of C++, written by Herbert Schildt (McGraw-Hill/Osborne, 2004; ISBN: 0072255129).

 

mot en pengesum kanskje?

Tror ikke du får så mye for pengene med den holdningen i Norge.

 

Relatert bok

 

http://www.amazon.com/Professional-Multicore-Programming-Implementation-Developers/dp/0470289627/

 

i disse tider med flerkjerne prosessorer.

 

Du kan sende med ekstra informasjon i threadstart opplegget. Bare legg med en referanse til objektet der, så er det jo en enkel sak.

 

Hei, jeg holder på med en Half-Life 2 mod der kildekoden til Source-spillmotoren er skrevet i C++. Jeg har ikke veldig mye erfaring med C++ og søker derfor etter hjelp.

 

Mest sannsynlig vet han ikke hva en referanse er i C++ eller hvordan objekter kommuniserer med hverandre.

 

Tilbake i midten av 90 årene kjørte jeg 15 C programmer samtidig under Presentation Manager i OS II på en IBM PSII Model 70-A21 med 386 prosessor. Det gikk fint. Markedet ville ikke ha OS II og multitasking og multithreading så ut til å være for tidelig i Norge den gang. Har glemt det meste nå, men det var ikke vanskelig.

Endret av Slettet+9871234
Lenke til kommentar

Tusen takk for svar begge to. Og ja, jeg vet hva referanse er :)

 

Forresten, løste problemet etter litt frem og tilbake. Det viste seg at trådimplementasjonen i Source faktisk kom fra et tredjeparts bibliotek (DLL) der meninga er at alt skal være deklarert globalt og ikke modifiseres slik at det brukes på en annen måte enn det jeg tenkte på i første omgang. Det som skulle til var å deklarere globale variabler i klienten, der de blir oppdatert når klienten mottar informasjon. I entity-objektet er det en metode som kjøres regelmessig av spillmotoren som sjekker om det er blitt endringer i de globale variablene siden sist gang, og da gjør ting basert på utfallet. Vet ikke om det er beste måten å løse problemet på, men det funker feilfritt og det holder.

 

Hvis noen andre har bruk for trådimplementasjon i C++ vil jeg anbefale å bruke MSDN Library og sjekke ut hvordan de gjør det der (det finnes tutorials).

Endret av kansas86
Lenke til kommentar
Gjest Slettet+9871234

Det viste seg at trådimplementasjonen i Source faktisk kom fra et tredjeparts bibliotek (DLL) der meninga er at alt skal være deklarert globalt og ikke modifiseres slik at det brukes på en annen måte enn det jeg tenkte på i første omgang. Det som skulle til var å deklarere globale variabler i klienten, der de blir oppdatert når klienten mottar informasjon. I entity-objektet er det en metode som kjøres regelmessig av spillmotoren som sjekker om det er blitt endringer i de globale variablene siden sist gang, og da gjør ting basert på utfallet. Vet ikke om det er beste måten å løse problemet på, men det funker feilfritt og det holder.

Min uthevning.

 

Kan du bruke navnerom ("namespaces")? Hvis det er mulig ville jeg personlig foretrukket den løsningen.

 

Generelt bør man legge tredje parts biblioteker i et eget navnerom for å unngå kollisjoner.

Endret av Slettet+9871234
Lenke til kommentar

Som jeg sa tidligere, så kan du sende med data i threadstart. Det du gjør, er å kikke på pointer-to-member, så kan du sende med en slik referanse til threadstart, og plutselig har du objektorientert trådstøtte.

 

Null stress joggedress.

 

Vær obs på at globale variabler kan føre til at programmet ikke er threadsafe.

Endret av GeirGrusom
Lenke til kommentar
Gjest Slettet+9871234

Vær obs på at globale variabler kan føre til at programmet ikke er threadsafe.

Vil det si at han burde bruke navnerom?

 

Tanken er at en liten del av moden min skal kjøre I en egen tråd fordi den skal motta strings over et eget nettverk som jeg har satt opp selv ved hjelp av sockets i C++. Source har en fin tutorial for akkurat dette: LINK

For øvrig er nettverksprogrammering i C++ et stort felt.

 

Som alltid noen bøker (som er anbefalt i litteraturen) men som jeg selv ikke har.

 

http://www.amazon.com/Network-Programming-Mastering-Complexity-Patterns/dp/0201604647

 

http://www.amazon.com/Network-Programming-Systematic-Reuse-Frameworks/dp/0201795256/

 

Denne http://accu.org/ anbefales i Accelerated C++ av Koenig & Moo. Der kan man finne en omtale av ulike bøker om C++ om man søker på C++ i søke feltet

 

http://accu.org/index.php?module=bookreviews&func=search

Endret av Slettet+9871234
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...