Übergabe an Thread



  • 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
    


  • Danke!

    @Jochen:

    Thx, aba das war ja nicht der Fehler (also wegen des Problems) oder?

    MFG



  • 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.

    @Codefinder:

    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?



  • Ich glaube Du musst Dir zuerst mal selber im klaren werden was Du willst, bevor Du hier weiter fragen stellen kannst...
    In Deinem Thread ist überhaupt nichts klar. Weder warum Du einen Thread machen willst, noch was Du mit der Socket-Verbindung überhaupt anstellen willst...
    Also: Erklär zuerst mal was Du machen willst, bevor Dir irgendwer überhaupt sinnvoll weiterhelfen kann...



  • Hallo,

    rofl

    also erstens weiss ich GENAU was ich will,
    ich habe es auch schon genau drei Mal beschrieben.

    egal, danke für eure Antworten, ich probiers einfach so lang weiter bis es irgendwann klappt.

    Alles was ich jetzt will ist dass die structs auch in der anderen Funktion bekannt sind.
    Global deklarieren funzt nicht:I:\Programme\PellesC\Projects\Threading\threading-2.c(20): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(20): error #2120: Redeclaration of 'ProtoClient' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(17): found 'int' expected 'unsigned int'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(20): error #2069: Initializer must be constant.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(22): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2001: Syntax error: found '&' - expecting ')'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2120: Redeclaration of 'memset' previously declared at I:\Programme\PellesC\Include\string.h(22): found 'int __cdecl function' expected 'void * __cdecl function(void *, int, unsigned int)'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2001: Syntax error: found ')' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(24): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(24): error #2120: Redeclaration of 'ProtoAddress' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(18): found 'int' expected 'struct sockaddr_in'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(24): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(24): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(25): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(25): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(25): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(25): error #2069: Initializer must be constant.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(35): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2120: Redeclaration of 'structname' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(33): found 'int' expected 'struct Sockets'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(35): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2069: Initializer must be constant.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(36): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(36): error #2001: Syntax error: found '.' - expecting ';'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(36): warning #2099: Missing type specifier.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(36): error #2069: Initializer must be constant.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(64): error #2113: Left operand of . has incompatible type 'int'.
    I:\Programme\PellesC\Projects\Threading\threading-2.c(64): error #2113: Left operand of . has incompatible type 'int'.
    *** Error code: 1 ***
    Done.


Anmelden zum Antworten