PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strukturen und Threads



wacked
07.08.2009, 11:42
Hallo,
wie kann man mit Strukturen in Threads arbeiten?


//struct
struct sGetFlood{
string server;
string url;
int time;
} *pGetFlood;//msdn
//threadfunc
DWORD WINAPI HTTPGetfloodThread(LPVOID Param){
pGetFlood param;
param=(pGetFlood) Param;//msdn
.....
}
//calling func
int HTTPGetflood(string target,string length){
pGetFlood param;
...
count=target.find('/');
param.server=target.substr(0,count);
param.url=target.substr(count+1);
param.time=Str2Int(length);
....

HANDLE Threads[GETFLOOD_THREADS];
DWORD ThreadID[GETFLOOD_THREADS];
for(int i=0;i<=GETFLOOD_THREADS;i++)
{
Threads[i] = CreateThread( NULL, 0, HTTPGetfloodThread, (LPVOID)param, 0, &ThreadID[i] );
}
...
}

von hier (http://msdn.microsoft.com/en-us/library/ms682516%28VS.85%29.aspx) habe ich die mit "//msdn" markierten zeilen.


c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(4) : error C2146: syntax error : missing ';' before identifier 'param'
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(4) : error C2065: 'param' : undeclared identifier
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(5) : error C2440: '=' : cannot convert from 'struct sGetFlood *' to 'int'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(5) : error C2146: syntax error : missing ';' before identifier 'Param'
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(10) : error C2228: left of '.server' must have class/struct/union type
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(10) : error C2228: left of '.c_str' must have class/struct/union type
c:\dokumente und einstellungen\wbot dev-user\desktop\bot\httpgetflood.h(14) : error C2228: left of '.time' must have class/struct/union type
(die letzten 3 gehen logischerweiße auch weg wenn die oberen gelöst sind.)

Vielen Dank für die Hilfe

inout
07.08.2009, 12:41
Du musst deinen struct Pointer natürlich noch bekannt geben und dir ein wenig Speicher für den Parameter holen, da dieser sonst wieder verfällt, wenn die Funktion verlassen wird. (Es sei denn du wartest mit WaitForMultipleObjects() auf diese.)

Ansonsten müsste es sich so eigentlich kompilieren lassen, wenn der Rest auch keine Fehler enthält:


//struct
typedef struct sGetFlood{
string server;
string url;
int time;
} sGetFlood,*pGetFlood;//msdn
//threadfunc
DWORD WINAPI HTTPGetfloodThread(LPVOID Param){
pGetFlood param;
param=(pGetFlood) Param;//msdn
.....
}
//calling func
int HTTPGetflood(string target,string length){
pGetFlood param;
...
count=target.find('/');
param->server=target.substr(0,count);
param->url=target.substr(count+1);
param->time=Str2Int(length);
....
param = (pGetFlood) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(sGetFlood));
HANDLE Threads[GETFLOOD_THREADS];
DWORD ThreadID[GETFLOOD_THREADS];
for(int i=0;i<GETFLOOD_THREADS;i++) // < reicht ;)
{
Threads[i] = CreateThread( NULL, 0, HTTPGetfloodThread, (LPVOID)param, 0, &ThreadID[i] );
}
...
}

wacked
07.08.2009, 14:45
danke alles funktioniert