[S] Hilfe bei Threads mit Delphi

  • Hey ich habe ein groÃ?es Problem. Ich will meinen Code ausführen lassen in einem Thread. Mein Thread Code ist nun folgender:




    Wie kriege ich mein Programm jetzt dazu das der Thread ausgeführt wird. Ich glaube ich habe schon im Thread fehler gemacht, aber im Internet finde ich einfach nichts das leicht verständlich ist.


    Also wie bekomme ich den Code ausgeführt das ich am Ende das Ergebniss in meinem Hauptfenster habe?

    [B] RS, Freundin, Altpapier, Datenbanken<br />[S] Nichts

  • Also ich habe das so gemacht :


    [Delphi]
    var
    ThreadID: DWORD; //Thread-ID
    ThreadHandle: THandle; //Rückgabewert von CreateThread


    function ISGAY // Blah Blah Blub^^ du brauchst afaik ne Function


    hreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ISGAY),nil, 0, ThreadID);


    //wenn der Thread erfolgreich gestartet wurde (ThreadHandle<>0), können
    //wir ThreadHandle wieder freigeben:
    if ThreadHandle<>0 then CloseHandle(ThreadHandle);
    [/delphi]


    Das Problem ist dass du es nicht gescheit beenden kannst (von auÃ?en killen)


    DH wenn der Thread aktiv istr und jemand beendet es dann wird gewartet bis der thread fertig ist


    Meiner zB war aber ne EndlosSchleife


    Also muss du was einbauen dass er bei net gegebenheit einfach aufhört oder noch besser (wegen Speicher)


    EndThread(0); machst, 0 = No Error..

  • hab ich doch.


    also du brauchst zwei variabeln


    dann ne Funktion muss exsistieren


    und dann :


    Code
    1. ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Funktionsname),nil, 0, ThreadID);
    2. //wenn der Thread erfolgreich gestartet wurde (ThreadHandle<>0), können
    3. //wir ThreadHandle wieder freigeben:
    4. if ThreadHandle<>0 then CloseHandle(ThreadHandle);
  • Das ThreadHandle würde ich nicht manuell freigeben. Dürfte beim Aufruf von ExitThread (Delphi müsste das automatisch nach dem Abarbeiten des Thread Codes aufrufen) sowieso geschlossen werden. Mit dem Handle könnte mann über TerminateThread() nämlich den Thread bei Bedarf auch abbrechen.


    Allerdings sind das nun Threads auf Win API Basis und nicht das TThread Object. Beim TThreadObject musst du eine Klasse von TThread ableiten und die Execute Methode überschreiben. Dann erzeugst du ein Objekt vom Typ TMyThread (also deine neue Klasse) entweder mit TRUE als Parameter oder mit FALSE und rufst danach Resume auf.