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 DE-CIX
Edge computing: behandling ved kilden
Edge computing revolutionerer den måde, data behandles på, ved at bringe kapacitet og ydeevne tættere på dér, hvor der er behov for det.
15. april 2025
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