int zu void *



  • Hallo,

    wie kann ich von int zu void * umwandeln?
    Denn ich habe ein Handle, welches ich in einer TStringList speichere und diesen kann ich dann zum Schluss ja nach int konvertieren, doch wie kann ich es in ein void * konvertieren?
    Oder gibt es eine bessere, ebenfalls leichte Methode Handels zu speichern??

    MfG
    TheCaleb



  • Hallo,

    Indem du castest

    void* Handel;
    int t = reinterpret_cast<int>(Handle);
    


  • Danke aber irgendwie klappt das noch nicht so ganz!
    Ich habe folgendes vor:

    TStringList* Thread = new TStringList;
    
    Thread->Add(_beginthreadex(NULL, 0, Warten,&Dateiname, 0, &ThreadID));
    
    for(int x=0;CSThreadAnz!=0;x++)
    {
     if(Thread->Count>x)
     {
      int tmp=atoi(Thread->Strings[x].c_str());
      HThread=reinterpret_cast<HANDLE>(tmp);
     }
     if(TerminateProcess(HThread,1))
     {
      CSThreadAnz--;
     }
    }
    

    Wo liegt mein Fehler, irgendwie schließt sich der Thread nicht so ganz?!



  • Hallo

    Warum benutzt du überhaupt eine TStringList? Ist denkbar ungeeignet.
    Rein syntaktisch würde ich das so umstellen

    #include <vector>
    ...
    std::vector<HANDLE> Threads;
    
    Threads.push_back(_beginthreadex(NULL, 0, Warten,&Dateiname, 0, &ThreadID));
    
    while (!Threads.empty())
    {
      if (!TerminateProcess(Threads.back(),1))
        break;
      Threads.pop_back();
    }
    

    Natürlich must du die Behandlung für das Scheitern von TerminateProcess noch anpassen.

    bis bald
    akari



  • Das kann ich so nicht sagen. Gibt TerminateProcess true zurück? Wenn es false zurückgibt kannst du ja mit GetLastError mal prüfen was los ist.



  • Hmmmm nun meint er: [C++ Error] Unit1.cpp(86): E2034 Cannot convert 'unsigned long' to 'void *'
    bei dieser Zeile:

    Threads.push_back(_beginthreadex(NULL, 0, Warten,&Dateiname, 0, &ThreadID));
    

    Obwohl der Rückgabewert von _beginthreadex ein Handle auf den gestarteten Thread sein soll!



  • Hallo

    Das liegt daran das du hier Thread-Behandlung von Ansi-C und WinAPI mischt. Wenn du _beginthreadex verwenden willst dann hast du auch keine HANDLE sondern ein long das den Thread identifiziert. Dann must du aber auch _endthreadex verwenden, da kannst du auch den long-Wert übergeben (und den vector auf long umstellen).
    Wenn du beim WinAPI-HANDLE bleiben willst must du auch die WinAPI-Funktion CreateThread verwenden, die liefert dir das benötigte HANDLE.

    Nicht zu vergessen das es eigentlich auch die VCL-Klasse TThread gibt die du eigentlich nehmen solltest.

    bis bald
    akari



  • Vielen Dank für die Antwort, doch mit der _endthreadex Funkion ist es nicht möglich den Thread zu schließen, also wenn er wie in meinem Fall in einer WaitForObject- Schleife ist wird dieser nicht geschlossen!
    Was kann ich dagegen machen??

    MfG
    TheCaleb



  • Hallo

    Nocheinmal : du darfst die beiden Threadbehandlungen nicht durcheinanderbringen. Wenn du also ein long hast das für _endthreadex geeignet ist dann ist dieser Wert nicht für WaitFor... geeignet!

    Um dir das ganze zu erleichtern solltest du besser aus TThread umsteigen.

    bis bald
    akari



  • Jo das weiß ich aber nochmal: Ich habe ein Thread mit _beginthreadex erstellt und mit _endthreadex möchte ich diesen nun beenden.
    IN diesem Thread ist eine WaitFor... Funktion und wenn ich den Thread mit _endthreadex beenden möchte läuft dieser weiter...

    Im Thread:
    Warteschleife=WaitForSingleObject(OpenProcess(PROCESS_ALL_ACCESS,true,processID),INFINITE);
    
    Im eigentlichen Programm:
    while (!Threads.empty())
    {
     _endthreadex(Threads.back())
     Threads.pop_back();
    }
    


  • Natürlich läuft der Thread weiter, schließlich wartet er auf das Event und nur auf dieses eine Event. Dies wäre allerdings mit allen Thread-Varianten so, ob er nun auf Win-API oder TThread wechselt ist dabei egal.

    Mögliche Lösung: Nicht unendlich warten, sondern nur einen kurzen Zeitraum (wiederholt in einer Endlos-Schleife) und zwischenzeitlich prüfen ob der Thread beendet wurde und die Schleife dann verlassen.



  • ...oder benutze "WaitforMultipleObjects" und benutze zum Beenden ein weiteres Event.
    😉



  • Vielen Dank, ich werde das dann gleich mal versuchen! 🙂


Anmelden zum Antworten