BlueDude Skrevet 7. mai 2010 Del Skrevet 7. mai 2010 (endret) Hei! Driver å lager et socket(win32) interface mellom to programmer, men får å få dette til å funke bra så trenger jeg tråder, noe jeg ikke er veldig flink med for å være ærlig. Har lagd en Thread.h fil som ser sån ut: template<class T, class P> class Thread { private: typedef void (T::*ThreadFunc)( P ); public: Thread(); virtual ~Thread(); void Suspend(); void Resume(); void Terminate(); bool IsThreadActive() const; bool Run( T* pClass, ThreadFunc pfFunc, P p ); }; Den kompilerer helt fint, men når jeg prøver å lage en thread: class ClientSocket { private: ... Thread<ClientSocket,int>m_thread; Så får jeg følgende link error`s: [iLINK32 Error] Error: Unresolved external 'Thread<ClientSocket, int>::~Thread<ClientSocket, int>()' referenced from C:\...\PROJECTS\DEBUG\CLIENTSOCKET.OBJ [iLINK32 Error] Error: Unresolved external 'Thread<ClientSocket, int>::Thread<ClientSocket, int>()' referenced from C:\...\PROJECTS\DEBUG\CLIENTSOCKET.OBJ Hvis jeg kommenterer ut "Thread<ClientSocket,int>m_thread;" så kompilerer det fint, men jeg sitter igjen uten tråder. Hva gjør jeg feil ? Endret 7. mai 2010 av BlueDude Lenke til kommentar
Giddion Skrevet 7. mai 2010 Del Skrevet 7. mai 2010 (endret) For å ta det enkle først har du en konstruktor og destruktor? Ellers så vil jeg si at Thread klassen veldig god ut. Endret 7. mai 2010 av Giddion Lenke til kommentar
Psy Skrevet 7. mai 2010 Del Skrevet 7. mai 2010 Problemet ditt er at det holder ikke å bare lage en header fil. Du må også ha en implementasjon et sted, vanligvis i en .cpp fil med tilsvarende navn. Du trenger heller ikke skrive thread klasser selv, disse finnes allerede i APIene til de fleste operativsystemer. Lenke til kommentar
BlueDude Skrevet 7. mai 2010 Forfatter Del Skrevet 7. mai 2010 For å ta det enkle først har du en konstruktor og destruktor? Ellers så vil jeg si at Thread klassen veldig god ut. Kan ikke si at jeg skjønte hva du mener her men... trenger ikke lage thread klasser selv, disse finnes allerede i APIene Noen som vet om en god api for windows ? Muligens også en som er cross-platformed som er enkel å implementere. Lenke til kommentar
Psy Skrevet 7. mai 2010 Del Skrevet 7. mai 2010 Det er inkludert i Windows APIet. Fant noe informasjon på http://www.codeproject.com/KB/threads/MultithreadingTutorial.aspxm og http://msdn.microsoft.com/en-us/library/ms682516%28v=VS.85%29.aspx. Du finner mer om du søker på google. Lenke til kommentar
BlueDude Skrevet 7. mai 2010 Forfatter Del Skrevet 7. mai 2010 Det er inkludert i Windows APIet. Fant noe informasjon på http://www.codeproject.com/KB/threads/MultithreadingTutorial.aspxm og http://msdn.microsoft.com/en-us/library/ms682516%28v=VS.85%29.aspx. Du finner mer om du søker på google. Fikk page not found på coedproject.com linken din, prøvde meg på å lage threads som gjort i msdn linken. Men får ikke dreiesen på parameterene til CreateThread() Min kode: WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int nShowCmd){ DWORD dwThread; HANDLE hThread; ClientSocket* cs = new ClientSocket; hThread = CreateThread(NULL,0,&cs->main(),NULL,0,&dwThread); ... } ClientSocket.cpp: DWORD WINAPI ClientSocket::main(LPVOID lParam){ while(1){ cout<<"Kjører Thread"; sleep(5000); } Får følgende error på linjen med CreateThread med &cs->main()i fokus: [bCC32 Error] Project1.cpp(27): E2027 Must take address of a memory location Hvis jeg fjærner "&" tegnet så får jeg: [bCC32 Error] Project1.cpp(27): E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'unsigned long') Lenke til kommentar
Psy Skrevet 8. mai 2010 Del Skrevet 8. mai 2010 http://www.codeproject.com/KB/threads/MultithreadingTutorial.aspx skal det være. CreateThread tar en adresse til en funksjon som parameter. Det du gjør er å sende resultatet av cs->main() metoden som antageligvis ikke er det du vil. Du kan uansett ikke sende en klassefunksjon som ikke er statisk som parameter. Så for at det skal bli riktig må cs->main være statisk og du skal ikke ha med & foran. Det står mer om hvordan du kan bruke klassemetoder på codeproject.com, Lenke til kommentar
Dead_Rabbit Skrevet 12. mai 2010 Del Skrevet 12. mai 2010 For guds skyld. Bruk trådbiblioteket til boost: http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html Ikke driv å styr med jævla Win32 API, osv. Boost.Thread er overlegent. Samme gjelder forøvrig socket-biblioteket; Boost.Asio. Lenke til kommentar
[kami] Skrevet 15. mai 2010 Del Skrevet 15. mai 2010 jeg tror ikke det vil funke, men fjern ihvertfall () på cs->main. Du skal gi den adressen til funksjonen, ikke kalle funksjonen. ta forøvrig en titt på denne siden: http://www.parashift.com/c++-faq-lite/pointers-to-members.html det finnes mange greie alternativer der ute som automatisk binder opp til medlemsfunksjoner med en grei syntask (boost, ace, ..) Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå