Frage zu Threads



  • Wenn du den Inhalt der Variablen nicht überschrieben hast, müsste dort noch die ID deines zweiten Threads drin stehen. Aber vermutlich war das nicht der "'Win32 Thread' (0x144)", der in den Trace-Ausgaben als beendet gemeldet wurde.



  • hm weis net, threads sind schwerer als ich dachte 😃



  • also wenn ich mein debugger gestartet hab hab ich darauf geachtet, wenn ich meinen thread starte hat er das im debugger gezeigt und zwar nachdem der download fertig war zeigte er Der Win32 Thread ... hat mit 0 geendet (0x0)also ich schätze schon das er den thread beendet hat den ich Mit CreateThread Gestartet hab .

    des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen



  • Zeig mal mehr Code. Wie ist 'RecieveThread' definiert ? Fehlt dort evtl. das Schlüsselwort 'static' ?

    PS: Vergiss das CloseHandle nicht!



  • Ascharan schrieb:

    des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen

    Soweit es sich um eine Singlethread Anwendung handelt muss der Thread beendet und das Handle geschlossen werden, bevor du den Thread erneut erzeugst.

    Aber nun mal die Frage, wo befindet sich der Funktionsaufruf

    WaitForSingleObject(RecieveThread , INFINITE);
    

    Wird er im Thread selber aufgerufen (also fragt sich der Thread selber ab, ob er sich beendet hat), oder im Code welcher den Thread startet (würde den Code ja auch blockieren, welches sicher nicht Sinn und Zweck eines Threads ist).
    Warum definiertst du dir nicht eine benutzerdefinierte Message, die beim Beenden den Downloads an den aufrufenden Code gesendet wird. Damit weis das eigentliche Prog dann, das der Thread 'geschlossen' werden kann.



  • Analog Bit schrieb:

    Ascharan schrieb:

    des weiteren wie kann ich den thread erneut ausführen so wie ich es bisher gemacht habe muss ich meine anwendung beenden und neustarten um den thread erneut aufzurufen

    Soweit es sich um eine Singlethread Anwendung handelt muss der Thread beendet und das Handle geschlossen werden, bevor du den Thread erneut erzeugst.

    Hm ist IMHO kein Muss, wohl aber ratsam 😃 .

    Wäre sowieso mal interessant zu wissen, ob Du die CTL auf Multithreaded umgestellt hast 🙄 .



  • In einer single threaded Anwendung verwendet man garkeine Threads die man selbst anlegt.

    Sobald man selsbt einen Thread anlegt ist die Anwendung also nichtmehr single threaded, und wenn man das Projekt trotzdem als single threaded eingestellt hat ist es ein Fehler.

    Das Schliessen des Handles ist dabei überhaupt nicht von Belang. Davon abgesehen sollte man es natürlich machen, einfach schon weil es zum guten Stil gehört.



  • ahm hä hab den überblick verloren sollte öffter vorbeischauen das Mit dem CTL hab ich noch net verstanden ich zeig morgen n bissle code bin zu müde bin grad erst nachhaus gekommen biss morgen äh heute mittag 😃



  • also hier der code:

    [cpp]
    //Thread ID
    unsigned long iID = 0;
    //Thread Handle
    HANDLE RecieveThread = NULL;
    
    // Thread Struct
    typedef struct _MyDownloadData { 
        HWND hwndProgress; 
        HWND hwndStaticText; 
        CHAR *szUrl; 
        CHAR *szFileName;     
    } MyDownloadData, *PMyDownloadData; 
    
    DWORD dwExitCode = 0; // Thread-ID
    
    DWORD WINAPI MyDownloadThread(LPVOID lpParameter) 
    { 
      PMyDownloadData myData=(PMyDownloadData)lpParameter; 
    
      // Deine InternetDownloadFile aufrufen: 
      InternetDownloadFile (myData->hwndProgress,myData->hwndStaticText,myData->szUrl, myData->szFileName); 
    
      // Thread hat fertig: 
      ExitThread(0); 
    }
    //...
    MyDownloadData threadData;
    
    threadData.hwndProgress=progress; 
    threadData.hwndStaticText=stext; 
    threadData.szUrl=buffer_a; 
    threadData.szFileName=buffer_b; 
    
    RecieveThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyDownloadThread,&threadData,0,&iID );
    WaitForSingleObject(RecieveThread, INFINITE); 
    CloseHandle( RecieveThread );
    [/cpp]
    

    mit CTL meinst du Certified Thread Library oder ?



  • Also ExitThread würde ich einmal weglassen, du konntest auch einfach return 0 dafür schreiben. Und dass du gleich nach der erstellung des threads auf ihn wartest macht dsen thread eigentlich unnötig. Wenn du window messages etc. währenddessen empfangen willst dann mach doch eine message schleife rein, oder benutz (MsgWaitForMultipleObjects).



  • Könnt ihr mir noch gute Literatur Empfehlen hab mir heut das buch von Olaf Neuendorf -> Windows Multithreading mit C++ & C# gekauft konnte net dran vorbeilaufen 😃 vorallem da ich bei diesem thema grad bin , da muss ich mich aber erst durchlesen den ersten überblick aber is das ein ziehmlich Complexes thema 😮 lol



  • Sorry, meine natürlich CRT (= C-Run-Time).



  • CodeFinder schrieb:

    ...
    Wäre sowieso mal interessant zu wissen, ob Du die CTL auf Multithreaded umgestellt hast 🙄 .

    CodeFinder schrieb:

    Sorry, meine natürlich CRT (= C-Run-Time).

    ähm nö :D, wo mach ich das 😕 ?



  • Welcher Compiler (IDE) ?

    Bei VC++ 2005:
    Projekt->Eigenschaften->Konfigurationseigenschaften->C/C++->Codegenerierung->Laufzeitbibliothek->Multithreaded (/MT)



  • Beim 2005er VC gibt *nurmehr* multithreaded... wird er sich also schwer tun etwas anderes als multithreaded (debug) (dll) eingestellt zu haben.



  • Sry Für die Späte Antwort: jap hab VC++ 2005



  • Hi,

    ich hab mir eine Anwendung programmiert, in der das Programm auf einen Thread warten soll, der im Grunde genommen so lange schläft, bis eine bestimmte File an einem bestimmten Ort existiert.

    Bis die File erzeugt wird vergeht knapp ne Minute(auch wenns unwichtig ist)

    Mein bisheriger Code sieht so aus:

    ///////////////FileExists
    DWORD WINAPI FileExists(LPCWSTR filename)
    {
    //Wenn File nicht vorhanden
    if (GetFileAttributes(filename) == -1 )
    {
    return 0;
    }
    else
    {
    return 1;
    }
    }

    //////////THREAD

    DWORD WINAPI Thread(LPVOID param)
    {
    while (FileExists(_T("bla.txt")) == 0)
    {
    Sleep(1000);
    }

    return 0;
    }

    /////////int_main
    int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    //Thread erzeugen
    HANDLE threadHandle = CreateThread(0,0,Thread,0,0,&threadID);

    //auf dessen beendigung warten
    WaitForSingleObject(Thread, INFINITE);

    ////REST
    }

    Leider wartet mein Programm nicht auf die Beendigung des Threads und schließt sich kurz nach Aufrufs des Threads 😞

    Könnt ihr mir vielleicht sagen, was ich falsch gemach hab?

    Gruß

    Nightmare



  • "WaitForSingleObject ()" braucht ein Threadhandle als Parameter :

    ...
    HANDLE threadHandle = CreateThread(0,0,Thread,0,0,&threadID); 
    ...
    // WaitForSingleObject(Thread, INFINITE);
    WaitForSingleObject(threadHandle, INFINITE);
    ...
    


  • Kanns leider erst Morgen probieren, werd mich dann aber noch mal melden

    Vielen Dank erstmal

    EDIT: Alles Klar das klappt bestens! Vielen Dank nochmal 😉

    Gruß

    Nightmare



  • Ich hab nochmal ne Frage:

    Und zwar will ich nun ne CAB-File mit Hilfe von ShellExecuteEx installieren.
    Meine Anwendung soll so lange nichts tun, bis die CAB-File vollständig installiert wurde.

    Habt ihr irgendeinen Tipp, wie ich dieses Problem am besten lösen könnte?

    Gruß

    Nightmare


Anmelden zum Antworten