Avatar billede 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?
Avatar billede bertelbrander Novice
07. maj 2006 - 19:50 #1
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 \\
Avatar billede Slettet bruger
07. maj 2006 - 19:55 #2
Den bliver ved med kun at skrive 00B2FB8C som output :S
Avatar billede bertelbrander Novice
07. maj 2006 - 20:00 #3
Bruger du CString?

Så prøv at skrive (const char *) foran, ved udskrivning, dvs:
  cout <<  (const char *)(*(CString *)Filename) << endl;
Avatar billede 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;
}
Avatar billede bertelbrander Novice
07. maj 2006 - 20:13 #5
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?
Avatar billede bertelbrander Novice
07. maj 2006 - 20:19 #6
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;
}
Avatar billede 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 !?
Avatar billede bertelbrander Novice
07. maj 2006 - 20:39 #8
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.
Avatar billede Slettet bruger
07. maj 2006 - 20:40 #9
jep mange tak!
Avatar billede bertelbrander Novice
07. maj 2006 - 20:43 #10
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.
Avatar billede Slettet bruger
07. maj 2006 - 21:05 #11
hmm nej det er der egentlig ikke...
Avatar billede bertelbrander Novice
07. maj 2006 - 21:48 #12
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);
}
Avatar billede Slettet bruger
07. maj 2006 - 22:07 #13
tak tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester