Übergabe an Thread
-
Hallo Allerseits,
ich habe folgene Frage und hoffe ihr könnt mir da helfen:
Ich habe in der Hauptfunktion ein socket und SOCKADDR_IN struct deklariert und letzteres auch initialisiert.
das connecten möchte ich ihn einem thread machen.
beide structs habe ich in ein struct gepackt und will dieses an den Thread übergeben.
Und jetzt kommts zur eigentlichen Frage:
Reicht es wenn ich dem Thread mein Struct übergebe oder muss ich dieses Struct jetzt auch an die Funktion übergeben?
Wenn letzteres zutrifft: Wie soll ich das machen? (hab das Gefühl das das GANZ einfach is lol aba steh grad auf der Leitung)
Denn ausserhalb der Hauptfunktion sind diese structs ja nicht gültig.
Wenn ichs als Parameter übergeben soll soll ich dann reinschreibenFunktionsname(SOCKET param_1,SOCKADDR_IN param2) (bei der Deklaration mein ich)?
MFG
-
Muhi89 schrieb:
Reicht es wenn ich dem Thread mein Struct übergebe oder muss ich dieses Struct jetzt auch an die Funktion übergeben?
Welche Funktion hast Du denn noch???
Verstehe ich nicht ganz...PS: Du musst darauf achten, dass der Übergebene Zeiger garantiert gültig ist, wenn den Thread darauf zugreift!
Also niemals sowas machen:void StartThread() { tThreadData data; data. = ...; // Fülle die data-Struct CreateThread(....., &data, ...); return; }
-
Hi,
ich versteh dich leider auch nicht ganz,
also mein code sieht in etwa so aus
includes
deklariere WSA STARTUP-Funktion
WinMain(parameter)
{
WAS-STARTUP
//deklariere "Objekte" des Typs SOCKET und SOCKADDR_IN;
//Fülle SOCKDDR_IN mit allen nötigen Datenneue Struktur deklarieren und beide structs reinpacken
CreateThread(Paramter) //startet MeinThread als Thread
//weiterer Code
return 0;}
MeinThread(Sockets param1)
{
connect(parameter)return 0;
}steh da voll auf der Leitung.
Alles was ich will ist, dass ich die´zwei Strukturen die für die Verbindung notwendig sind deklariere etc, und dann in einem Thread versuche zu connecten.
PS: Wieso funzt das nicht? data is wird ja gefüllt

-
wie wäre es einfach mit a bissi code? anstatt diesen falschen pseudocode

zb: konvention der thread funktion stimmt nicht.
ps: schön und gut wenn sie gefüllt sind aber sind diese auch zum zeitpunkt der dereferenzierung auch gültig?
-
Ich würde sagen, du müsstest im Haupt-Thread mit WaitForSingleObject auf deinen Connect-Thread warten.
-
Dr. C++ schrieb:
Ich würde sagen, du müsstest im Haupt-Thread mit WaitForSingleObject auf deinen Connect-Thread warten.
Warum dann überhaupt die Mühe mit dem Thread!?
-
Jochen Kalmbach schrieb:
Dr. C++ schrieb:
Ich würde sagen, du müsstest im Haupt-Thread mit WaitForSingleObject auf deinen Connect-Thread warten.
Warum dann überhaupt die Mühe mit dem Thread!?
Hab ich mich auch gefragt, aber den Code, den er gepostet hat, ist ja nur Pseudocode. Es kann ja sein, dass er im Hauptthread noch was anderes macht.
@Muhi89: Wenn der Hauptthread ausläuft wird die Anwendung beendet und mit ihr alle laufenden Threads.
-
Dr. C++ schrieb:
@Muhi89: Wenn der Hauptthread ausläuft wird die Anwendung beendet und mit ihr alle laufenden Threads.
Zumindest wenn man dir CRT verwendet, da diese ExitProcess aufruft...
Siehe auch: When does a program terminate?
http://blog.kalmbachnet.de/?postid=65
-
Hallo,
ja ich mache einen extra Thread damit ich während des Verbindungsversuches was checken kann und verarbeiten kann.
MFG
-
#pragma comment( lib, "ws2_32.lib" ) #include <winsock2.h> #include <winsock.h> #include <stdio.h> #include <time.h> #include <windows.h> #include <stdio.h> int Connection(void); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInstance_2, LPSTR CmdLine, int Show ) { int id=1; SOCKET ProtoClient; SOCKADDR_IN ProtoAddress; ProtoClient=socket(AF_INET,SOCK_STREAM,0); memset(&ProtoAddress,0,sizeof(SOCKADDR_IN)); ProtoAddress.sin_family=AF_INET; ProtoAddress.sin_port=htons(12345); ProtoAddress.sin_addr.s_addr=ADDR_ANY; struct Sockets { SOCKET Client; SOCKADDR_IN Address; } structname; structname.Client=ProtoClient; structname.Address=ProtoAddress; //Diese Daten möchte ich jetzt an den Thread übergeben handle=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Connection,(LPVOID)&structname ,0,&id); return 0; } int Connection(void) { return 0; }Da ich ja auf der Leitung stehe kann ich nur mal diesen Code posten.
Mein Problem:
Reicht es wenn ich das struct per CreateThread übergebe oder muss ich es auch der Funktion übergeben?
MFG
-
Wenn man casten muss, dann ist das immer ein schlechtes Zeichen!
Deshalb: Lass das casten weg und mach:DWORD WINAPI Connection(void);und
handle=CreateThread(0,0, Connection,(LPVOID)&structname ,0,&id);
-
Hallo,
danke für die Antwort,
was bewirkt "DWORD WINAPI"? (nicht schlagen gg)
mfg
-
DWORD ist der Rückgabetyp
typedef unsigned long DWORD;und WINAPI kümmert sich um die Calling-Convention.
(also was die Parameter und so angeht, aber das geht dann schon in den Bereich Assembler)#define WINAPI __stdcall // Standard ist __cdecl // es gibt auch noch __fastcall
-
-
Was für ein Fehler? und was für ein Problem?
-
Vielleicht könntest du erstmal sagen, WAS nicht funktioniert. Nimmt der Compiler den Code nicht(könnte ich mir vorstellen) oder passiert im Programm einfach nix?
-
Wenn ich Dir mal was (fast) ganz anderes vorschlagen
:
Warum nimmst Du nicht die WinInet-API, da ist schon alles in Threads gepackt! Da bekommste dann ne Nachricht, wenn was spezielles passiert (Daten angekommen, Connect erfolgreich, usw. ...).
-
Das Problem ist,dass ich nicht weiss WAS ich machen soll/muss.
Ich will einen eigenen Thread nur fürs connecten machen.
Muss ich jetzt das Struct dass die beiden anderen Structs beinhaltet NUR an den Thread übergeben ODER auch an die Funktion übergeben.
Hmm Thx das schau ich mir gleich mal an.
Wär trotzdem froh wenn ich wüsste wie ichs ohne WinInet API mach
Lg
-
Wenn du den Thread nur fürs connecten benutzen willst: warum initialisiert du die ganzen structs nicht einfach in deinem Thread und lässt deine WinMain damit in Ruhe?!
-
#pragma comment( lib, "ws2_32.lib" ) #include <winsock2.h> #include <winsock.h> #include <stdio.h> #include <time.h> #include <windows.h> #include <stdio.h> DWORD WINAPI Connection(void) { SOCKET ProtoClient; SOCKADDR_IN ProtoAddress; ProtoClient=socket(AF_INET,SOCK_STREAM,0); memset(&ProtoAddress,0,sizeof(SOCKADDR_IN)); ProtoAddress.sin_family=AF_INET; ProtoAddress.sin_port=htons(12345); ProtoAddress.sin_addr.s_addr=ADDR_ANY; struct Sockets { SOCKET Client; SOCKADDR_IN Address; } structname; structname.Client=ProtoClient; structname.Address=ProtoAddress; connect(structname.Client,(SOCKADDR*)&structname.Address,sizeof(SOCKADDR)); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInstance_2, LPSTR CmdLine, int Show ) { unsigned long int id=1; //Diese Daten möchte ich jetzt an den Thread übergeben HANDLE handle; handle=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Connection,(LPVOID)&structname ,0,&id); return 0; }k nur jetzt hab ich (auch wenns sicher n triviales Problem ist) das Problem, dass structname nur in Connection gültig ist.
Lg
-
Global deklarieren?