Programm hängt bei schleife oder eintrag???? (erledigt)



  • Hallo,
    wenn ich eine grosse Schleife habe oder mit eine Schleife in ein Listbox, ValueListEditor usw... daten eintrage hängt das gesamte Programm bis die Schleife (mit oder ohne einträge ) zu ende ist.

    Könntet ihr mir Bitte weiter helfen und mir Tipps geben wie man so etwas löst oder programmiert damit nicht immer das gesamte Programm hängt wenn man wo anderes ein abfrage durchgeführt hat.

    Wie gesagt da habe ich wenig Erfahrung, Danke.



  • Du musst solche zeitintensiven Berechnungen am besten in einen eigenen Thread packen, dann hängt auch nix.



  • Hallo

    Siehe auch dieses Tutorial zum Thema Threads

    bis bald
    akari



  • Danke für die Antworten.
    Werde mich sofort damit befassen.



  • Hallo,
    eine Frage habe ich noch, muss ich für jede Schleife oder Methode einen Thread anlegen oder reicht es nur einen Thread anlegen und dann die Methoden in Header des thread ein zu bauen.
    Irgendwie kann ich es nicht aus der Thread beispiel entnehmen.

    Danke.



  • Du definierst eine Funktion, die in einem eigenen Thread laufen soll, und packst da alles rein, was halt parallel laufen soll. Für deine Zwecke (Dialog weiter eingabebereit) reicht natürlich ein weiterer Thread. Wenn du meinst, dass deine Berechnungen selbst auch sinnvoll weiter aufgesplittet werden können, kannst du die auch auf mehrere Threads verteilen. Das kann dann auch eine Threadfunktion sein, die du (mit verschiedenen Parametern) mehrfach aufrufst. Ein Beispiel wäre die Bildverarbeitung. Wenn du in einem Bildspeicher jeden Pixel irgendwie verändern willst (z.B. aufhellen), dann kannst du das Bild in mehrere Abschnitte unterteilen (z.B. Anzahl der verfügbaren Kerne) und mehrere Thread parallel laufen lassen, die jeweils ihren Abschnitt bearbeiten. Auf Beendigung eines Threads kannst du übrigens mit WaitForSingleObject warten, auf mehrere (Array of Handles) mit WaitForMultipleObjects. Du übergibst an diese Funktionen die Handles, die du z.B. von _beginthreadex zurückbekommst.



  • Ja, das mit weitere Threads funktioniert.
    Mein Problem oder Frage ist, kann ich die TMyThread::Execute
    für eine Methode immer auswählen.
    Das Problem ist ich kann viele Methoden schreiben in einen Thread (Datei) super, aber wie wie kann ich den Execute sagen wenn Button1 geklickt ist machst du Methode lesen() und wenn Button2 geklickt wird lesedatei().

    void __fastcall TMyThread::Execute
    {
    ...
    Synchronize(&lesen)
    ...
    }
    

    oder bei Button1 oder zwei kann ich die Methode auswählen??, weil da steht ja immer nur

    void __fastcall TForm1::Button1Click(TObject *SEnder)
    {
     new TMyThread(false);
    }
    

    Im Internet habe ich nich t gefunden und im Anwenderhandbuch Borland Developer Studio 2006 mit Seine 800 Seiten steht auch nicht mehr.

    Danke.



  • Du kannst ja einen weiteren Konstruktor erzeugen, oder den bestehenden modifizieren und um entsprechende Parameter erweitern.

    Gruß KK



  • @Killer-Kobold
    Bitte wenn es geht schreibe mir ein Beispielcode.
    Ich habe gestern ganze Zeit veruscht irgendwie zu modifizieren oder erweitern usw...
    Leider hatte ich kein erfolg weil ich mit Thread gerade angefangen habe und im Internet Leider kein Beispiel ist oder ich finden kann.
    Für ein paar zeilen Code wäre ich sehr sehr Dankbar.



  • Man könnte es zB so lösen:

    in der Headerdatei des Threads

    _fastcall MyThread(bool CreateSuspended, int MethodID);
    private:
    int iMehodID;
    

    in der CPP

    __fastcall MyThread::MyThread(bool CreateSuspended, int MethodID)
    	: TThread(CreateSuspended)
    {
    	iMethodID = MethodID;
    }
    //---------------------------------------------------------------------------
    void __fastcall MyThread::Execute()
    {
    	switch (iMethodID)
    	{
    	  case 0: // was auch immer;
    	  break;
    	  case 1: // was auch immer;
    	  break;
    	}
    }
    //---------------------------------------------------------------------------
    


  • Bingo.
    Klasse Beispiel.
    Genau das war mein Problem, wusste nicht wie ich das Proggen soll.
    Danke nochmal.


Anmelden zum Antworten