TThread stopen-neue Daten-neu starten??



  • Hallo Leute,

    ich habe ein kleines Problem. Ich erstelle Global ein Thread-Objekt, so das
    ich von überall drauf zugreifen kann, im Header der Threads habe ich einige
    Variablen die mit Werten gesetzt werden sollen. Ich möchte nun den Ablauf im
    Thread stoppen, den Variablen neue Daten geben und diesen Thread neu Starten
    so das er vom Anfang an wieder Arbeitet:

    der Thread-Header:

    .....
    protected:
            void __fastcall Execute();
    public:
            AnsiString quellurlA;
            AnsiString quellurlB;
            AnsiString quellurlC;
            AnsiString quellurlD;
            TImage *imgA;
            TImage *imgB;
            TImage *imgC;
            TImage *imgD;
    .......
    

    die CPP Datei oben

    ...
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TMeinThread *SubProg = new TMeinThread(true);  // hier der Thread
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    .....
    

    Nun übergeb ich die Daten und starte den Thread:

    ...
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
            SubProg->quellurlA = "Http://....1.jpg";
            SubProg->quellurlB = "http://....2.jpg";
           // bis quellurlD
           SubProg->imgA = Image1; // Image1=TImage auf der Form
           // etc bis imgD
    
          // Thread starten:
          SubProg->Resume();
    }
    

    Soweit so gut, wenn der Thread fertig ist und ich im dann neue Daten gebe und
    mit Resume wieder starte macht er es auch, ABER

    wie kann ich den Thread vorzeitig stoppen (SunProg->Suspend() ), dann neue
    Daten geben und von Anfang an wieder Arbeiten lassen????

    Danke für eure Hilfe
    gruß promicha



  • Was macht denn der Thread in Execute?

    Ich hab mal sowas gemacht (in Execute):

    ......Execute(.....)
    {
      do
      {
        Init();//Start- Operationen in Funktion; ev mit Synchronize!
        while (!Terminated) 
        {
          // hier alle Befehle fuer den Ablauf
          // (Sequenz,Schleife ...
          if (Restart)
            break;
        }
        if (!Terminated)
          Suspend();
      }
      while (!terminated)
    }
    

    Restart ist 'ne public- Variable des Thread
    in Init auf false gestellt!!!

    Wenn Du von AUSSEN die Variable auf true stellst, bricht die innere Shleife ab und der Thread bleib stehen - ausser wenn Abbruch durch Terminate verursacht wird!.



  • @Promicha... du solltest in der FAQ mal den Artikel über Public-Variablen zu Gemüte führen...

    -junix



  • @Junix
    Den FAQ-Beitrag kenne ich, und ich schreibe auch nie Public-Variablen,
    aber ich bin gerade im Experimentierstadium um Herauszufinden wie ich
    das am Besten löse, das ich ein Thread stoppe und mit neuen Daten von
    vorne starte. Erst wenn alles soweit klar ist Optimiere ich den gesamten
    Code, nur jetzt zum Experimentieren nutze ich die schnelle Variante.

    Hast du vieleicht eine Idee wie ich das noch anders lösen kann, oder
    wie mann ein Thread anhalten und zum Anfangspunkt zurück setzten kann?

    gruß promicha


Anmelden zum Antworten