Frage zu Threads



  • 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



  • ShellExecuteEx () liefert bei erfolgreicher Ausführung ein Handle vom gestarteten Prozess in der SHELLEXECUTEINFO-Struktur (Member hProcess).
    Der lässt sich auch mit WaitForSingleObject () nutzen, i.e. so :

    SHELLEXECUTEINFO shinf; 
    ...
    ShellExecuteEx       (&shinf);
    WaitForSingleObject  ( shinf.hProcess,INFINITE);
    ...
    


  • OK, das hilft mir ja schon mal weiter.

    Aber wie finde ich heraus, wann der Prozess(spricht mein CAB) vollständig beendet ist?

    Ich hab folgendes vor:

    DWORD WINAPI Install
    {
    SHELLEXECUTEINFO ShellInfo;

    ShellInfo.cbSize = sizeof(ShellInfo);
    ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShellInfo.hwnd = NULL;
    ShellInfo.lpVerb = _T("open");
    ShellInfo.lpFile = _T("MeineCAB");
    ShellInfo.lpParameters = _T("");
    ShellInfo.lpDirectory = _T("");
    ShellInfo.nShow = SW_SHOW;
    ShellInfo.hInstApp = NULL;

    // CAB ausführen
    ShellExecuteEx(&ShellInfo);

    while(///CAB installiert wird///)
    {
    ///schlafe///
    }
    }

    Das ist mein Thread, der meine CAB installieren soll. Meine Anwendung wartet nun mit "WaitForSingleObject" auf die Beendigung des Threads um weiter machen zu können.

    Habt ihr irgentwelche Vorschläge?

    Gruß

    Nightmare



  • Wie merker schon sagte - mit WaitForSingleObject() und Kollegen (der wartet darauf, daß das übergebene Handle "signalisiert" wird - und ein Thread- oder Prozess-Handle schaltet auf "signalisiert", wenn der zugehörige Thread bzw. Prozess sich beendet hat).



  • OK habs hinbekommen 🙂

    Vielen Dank für eure Hilfe!

    Gruß

    Nightmare


Anmelden zum Antworten