Thread .. kapiere es einfach nicht



  • Hallo,

    ich habe ein Thread programmiert jedoch habe ich jetzt einige verständnis Fragen dazu. Hoffe Ihr könnt mir weiterhelfen.

    Also im Thread ist ja eine

    Execute();
    

    Methode und der Konstruktor.
    Ich habe den Konstruktor überschrieben damit ich variablen dem Thread übergeben kann.
    Soweit ist das auch alles ok.

    So wenn ich jetzt in meinem Thread in der Methode Execute(); folgenden Code reinschriebe passiert leider nichts.

    HWND ghAppWnd = FindWindow("menue_form", 0);
    TComponent* AOwner=new TComponent(false);
    
    //Hauptpanel erzeugen
    TPanel *meinpanel = new TPanel(ghAppWnd);
    meinpanel->Width=762;
    meinpanel->Height=121;
    meinpanel->ParentBackground = false;
    meinpanel->Brush->Color = cl3DLight;
    meinpanel->BorderWidth=1;
    meinpanel->BorderStyle=bsNone;
    

    //Hauptpanel in der Form menue_form anzeigen
    meinpanel->Parent=menue_form->maschinen_frame->maschinen_anzeige;
    meinpanel->Top=top;
    meinpanel->Left=3;[/code]

    Ist die Execute(); Methode nicht einfach für alle Möglichen Source Code ?
    Oder ist diese methode nur für Rechenoperationen gedacht?
    Diese Frage stelle ich weil im Tutorial wurde eine Methode anzeigen(); implementiert die nach dem Rechnen in der Execute für das anzeigen aufgerufen wurde.

    Also zusammengefasst: Was darf ich in der Methode Execute(); machen?

    Und darf ich ein Thread von einer Form in einer Schleife öffnen?
    Das heißt z.B.:

    for(int i=0;i<=20;i++)
    {
    new Tmaschinen_anzeige(false);
    }
    

    Wird dadurch nicht eine neue Instanz von dem Thread erstellt?
    Oder führt das zu Problemen?



  • Hallo

    Grundsätzliches zum Umgang mit TThread findest du in diesem Tutorial. Grundsätzlich darfst du in einem Thread-Execute alles machen. Aber bei Operation die Instanzen außerhalb des Threads beeinflußen, insbesondere bei Zugriffen auf GUI-Elemente, must du die im Tutorial angesprochene Syncronize-Funktion benutzen.

    Allerdings kommt mir dein Quellcode recht seltsam vor.

    HWND ghAppWnd = FindWindow("menue_form", 0); 
    // Warum das? Wenn du ein Form aus deiner eigenen Anwendung haben willst dann include den Header des Forms 
    //und benutzt den Zeiger der im Header automatisch deklariert wird.
    // Hast du doch in Zeile 12 auch gemacht
    
    TComponent* AOwner=new TComponent(false);
    // Was soll diese Zeile machen?! Statt dem false solltest du lieber 0 oder NULL übergeben. 
    //Und wozu brauchst du ein nacktes TComponent? Damit kannst du nichts anfangen, zumal du es in dem Code hier nirgends weiter verwendest! 
    // Vom Speicherloch wegem fehlenden Owner ganz zu schweigen
    // Mich wundert das TComponent nicht akstrakt ist...
    
    //Hauptpanel erzeugen
    TPanel *meinpanel = new TPanel(ghAppWnd);
    // Hier solltest du lieber direkt ein VCL-Owner angeben, zum Beispiel den aus Zeile 1 angesprochenen Form-Zeiger.
    

    bis bald
    akari
    [/cpp]



  • Hi,

    danke erstmal für deine hilfe zur Verbesserung des Codes.
    Den TComponent benötige ich weil weiter unten im Code ein TImage und TLabel's erzeugt werden und die benötigen das im Konstruktor.

    Also das heißt ich darf Instanzen innerhalb der Execute(); vom Thread erzeugen ??? Oder zählt das auch schon zu "Zugriff auf GUI Elemente" ?
    z.B.:

    TLabel *kontakt_anzeige = new TLabel(AOwner);
    kontakt_anzeige->Font->Name="Arial";
    kontakt_anzeige->Font->Style= TFontStyles() << fsBold;
    kontakt_anzeige->Font->Color=0x00996532;
    kontakt_anzeige->Font->Size=9;
    kontakt_anzeige->Left=367;
    kontakt_anzeige->Top=32;
    kontakt_anzeige->Caption="Kontakt: ";
    

    jedoch das anzeigen:

    meinpanel->Parent=menue_form->maschinen_frame->maschinen_anzeige;
    

    müsste ich mit der Synchronoize Funktion realisieren?!

    Und darf ich jetzt das Thread oft beliebig hintereinander öffnen?Oder führt das zu Problemen?

    for(int i=0;i<=20;i++)
    {
    new TMeinThread(false);
    }
    


  • Hallo

    Den TComponent benötige ich weil weiter unten im Code ein TImage und TLabel's erzeugt werden und die benötigen das im Konstruktor.

    Die benötigen eine sinnvolle Komponente als Owner. Übergib doch einfach das Form als Owner.

    Also das heißt ich darf Instanzen innerhalb der Execute(); vom Thread erzeugen ??? Oder zählt das auch schon zu "Zugriff auf GUI Elemente" ?
    z.B.:

    Das sollte auch synchroniziert werden. Es ist übrigens ungewöhnlich das in einem Hintergrundthread GUI-Komponenten erstellt werden. Normalerweise sollten in einen Thread nur bestehende GUI-Komponenten modifiziert werden (Ausgabewerte setzen etc). Eventuell solltest du dein Konzept überdenken (oder deine Absichten hier näher erläutern)

    Und darf ich jetzt das Thread oft beliebig hintereinander öffnen?Oder führt das zu Problemen?

    Grundsätzlich ist das erlaubt. Ob das zu logischen Problemen führt, kann ich nicht abschätzen weil dazu mir der Überblick über dein Projekt fehlt. Gerade ein Thread der GUI-Komponenten erstellt und mehrfach gestartet wird kommt mir merkwürdig vor.

    bis bald
    akari



  • akari schrieb:

    ... Es ist übrigens ungewöhnlich das in einem Hintergrundthread GUI-Komponenten erstellt werden. Normalerweise sollten in einen Thread nur bestehende GUI-Komponenten modifiziert werden (Ausgabewerte setzen etc). ...

    Na so ungewöhnlich ist das sicher nicht, vielleicht etwas selten in der Verwendung.

    a) Ich habe eine Komponente, die eine Liste von (Bild-) Dateinamen erhält und alle Bilder skaliert als Thumbnails in einer Scrollbox anzeigt. Das Laden, skalieren und erzeugen der "Thumbnail- Komponenten" erfolgt in einem Thread!
    Natürlich immer schön mit Synchronize !!!

    b) Noch ne Komponente die ein Bild beliebig zoombar darstellt. Das Bild wird direkt in die Anzeige skaliert - mit schlechter Qualität aber schnell - und ein Thread gestartet, der das Skalieren in hoher Qualität wiederholt. Beim Terminieren des Thread wird das Bild in die Anzeige geholt (in ein Buffer- Bitmap) - das macht nach einer Postmessage vom Thread der HauptThread!!!

    Wird schnell nacheinander gezoomt, wird der Thread jeweils vorzeitig terminiert, damit ist schnelles Zoomen möglich - besonders effektiv bei Bildern >10MPixel.

    Beides klappt bestens.
    Während die Threads laufen kann "vorn" schon weiterbedient werden.
    Problematisch war nur, die Threads bei Bedarf sofort terminieren zu lassen und "vorn" erst nach Terminate wietermachen zu lassen.

    Gruss
    Frank


Anmelden zum Antworten