Slettet bruger
07. maj 2006 - 19:38
Der er
12 kommentarer og 1 løsning
CreateThread med argument, hvordan?
Jeg starter en tråd der kører RecvFile, jeg skal bruge Filename i RecvFile funktionen: CString Arguments = "C:\Hejsa.jpg"; CreateThread(0, 0,(LPTHREAD_START_ROUTINE)RecvFile, &Arguments, 0, 0); void RecvFile(CString Filename) { cout << Filename <<endl; } Men den skriver bare mærkeligt tegn ud, hvorfor?
Annonceindlæg fra Computerworld it-jobbank
Du giver funktionen en pointer til en CString, men den forventer en CString. Fordi du caster functions parametren i kaldet til CreateThread brokker compileren sig ikke. Du kan ikke overføre en CString, kun en poiner til en. Det kan se sådan ud: #include <string> #include <windows.h> #include <iostream> using namespace std; DWORD WINAPI RecvFile(void* Filename) { cout << *(std::string *)Filename <<endl; return 0; } int main() { std::string Arguments = "C:\\Hejsa.jpg"; CreateThread(0, 0, RecvFile, (void *)&Arguments, 0, 0); Sleep(1000); } Jeg har brugt en std::string i stedet for en CString, du kan bare bytte hvis du vil. RecvFile funktionen SKAL se sådan ud, så du må caste tilbage fra void * Bemærk at når du vil have en \ i en streng skal du skrive \\
Slettet bruger
07. maj 2006 - 19:55
#2
Den bliver ved med kun at skrive 00B2FB8C som output :S
Bruger du CString? Så prøv at skrive (const char *) foran, ved udskrivning, dvs: cout << (const char *)(*(CString *)Filename) << endl;
Slettet bruger
07. maj 2006 - 20:02
#4
Det crasher bare :( DWORD WINAPI RecvFile(void* Filename); CString hej= "C:\\Hejsa.jpg"; CreateThread(0, 0,(LPTHREAD_START_ROUTINE)RecvFile,(void *)&hej, 0, 0); DWORD WINAPI RecvFile(void* Filename) { cout << (const char *)(*(CString *)Filename) << endl; return 0; }
Dette virker, så der må være en feje et andet sted. using namespace std; DWORD WINAPI RecvFile(void* Filename) { cout << (const char *)(*(CString *)Filename) <<endl; return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { CString Arguments = "C:\\Hejsa.jpg"; CreateThread(0, 0, RecvFile, (void *)&Arguments, 0, 0); Sleep(1000); cin.get(); return 0; } Må vi se noget mere kode?
En mulig forklaring kan være at RecvFile ikke er færdig med strengen inden CString objektet forsvinder. Det kan man f.ex. løse med: DWORD WINAPI RecvFile(void* FileName) { CString *str = (CString *)FileName; cout << (const char *)*str <<endl; delete str; return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { CString *Arguments = new CString("C:\\Hejsa.jpg"); CreateThread(0, 0, RecvFile, (void *)Arguments, 0, 0); Sleep(1000); cin.get(); return 0; }
Slettet bruger
07. maj 2006 - 20:25
#7
hmm jeg fandt "fejlen" det virker kun hvis der er en Sleep efter CreateThread, fjerne jeg sleep crasher det !?
I så fald er det fordi "den" når at nedlægge CString objektet inden RecvFile er færdig med at bygge det. Løsningen har jeg postet ovenfor.
Slettet bruger
07. maj 2006 - 20:40
#9
jep mange tak!
Er der nogen grund til at du bruger CString? Den er ikke standard, kan ikke noget som std::string ikke kan, og er elendigt designet.
Slettet bruger
07. maj 2006 - 21:05
#11
hmm nej det er der egentlig ikke...
I så fald: #include <string> #include <windows.h> #include <iostream> using namespace std; DWORD WINAPI RecvFile(void* Filename) { string* Str = (std::string *)Filename; cout << *Str <<endl; delete Str; return 0; } int main() { string* Arguments = new string("C:\\Hejsa.jpg"); CreateThread(0, 0, RecvFile, (void *)Arguments, 0, 0); Sleep(1000); }
Slettet bruger
07. maj 2006 - 22:07
#13
tak tak :)
Kurser inden for grundlæggende programmering