|
| AfxBeginTread() ??? Fra : Ukendt |
Dato : 01-05-04 23:41 |
|
Hej NG
Til løsning af et skoleprojekt (at skrive en FTP client), trode jeg at jeg
skulle ud i noget multitreading, men med lidt hjælp her fra NG, fandt jeg en
løsning uden treading. Nu er jeg dog blevet nysgærig mht. treading, og vil
nu prøve at omskrive det så det benytter multitreading.
Jeg har dog lidt problemmer med at få oprettet en ny tread, og håber at en
af jer kan hjælpe mig lidt på vej. I første omgang vil jeg bare lave en
tread der skriver en linie til skærmen og selv terminere igen(bare for at
starte et sted), og mener derfor ikke jeg behøver at bekømre mig om synk.
mellem treadsene.
Jeg har instantieret et objekt hvor en af member funktionerne(DataCon) skal
oprette en ny tread, Den starter med at lave en strukt og fylle noget data i
strukten, for at kunne overføre disse data til den nye tread. Derefter
kaldes AfxBeginTread med navnet på den funktion som skal køres i treaden,
adressen på strukt med parametre osv.
Problemmet er at den ikke vil kendes ved navnet på funktionen
(Thread_Data_Con). I de tutorials jeg har læst har ligger funktionen i cpp
filen for klassen, men uden at dens prototype er med i h filen. Kan det være
rigtig???
Desuden har jeg ikke kunne finde helt ud af hvad LPVOID og lpvParam er for
nogle størelser, men går ud fra at det svare til Argc og Argv i main
funktionen, er dette korrekt???
Koden til funktionerne ses her under:
På forhånd tak
Bjarke
PS: kodes i Visual studio 6 som et consolprogram.
UINT Ccontrol::Thread_Data_Con(LPVOID lpvParam)
{
cout << "hej fra den nye thread";
return 0;
}
void Ccontrol::DataCon(int Port_nr, char* IP_nr)
{
Thread_Param Data_Con_Param;
Data_Con_Param.Port = Port_nr;
strcpy(Data_Con_Param.IP_addr, IP_nr);
AfxBeginThread(Thread_Data_Con, &Data_Con_Param, THREAD_PRIORITY_NORMAL, 0,
0);
}
| |
Bertel Brander (02-05-2004)
| Kommentar Fra : Bertel Brander |
Dato : 02-05-04 00:38 |
|
Hej,
Man kan ikke bruge en normal member funktion med AfxBeginThread,
men man kan bruge en static member function.
Hvis man vil kalde en member function kan man lave en static
funktion der kalder member funktionen. Man giver så en pointer
til objektet med som argument til denne static function:
class Whatever
{
public:
static int StaticFunc(LPVOID);
void IkkeStaticFunc();
void Start();
};
void Whatever::Start()
{
AfxBeginThread(StaticFunc, (LPVOID )this, HREAD_PRIORITY_NORMAL, 0, 0);
}
int Whatever::StaticFunc(LPVOID Param)
{
Whatever *P = (Whatever *)Param;
P->IkkeStaticFunc();
}
Du kan også putte en
Ccontrol *Me;
ind i Data_Con_Param, og så tilgå den ikke-static member
function gennem denne.
/b
| |
Ukendt (03-05-2004)
| Kommentar Fra : Ukendt |
Dato : 03-05-04 22:10 |
|
Mange tak
Det var lige det jeg manglede for at få skidtet til at virke.
Hilsen Bjasen
| |
|
|