Controls in einem Thread benutzen



  • Ich rufe inerhalb einen Formulas einen Thread auf von dem aus ich auch Controls von diesem Form steuern wollte. Nur habe ich leider keine Idee wie ich diese Ansteuern sollte. Kann mir das evl. jemadn helfen?



  • Klausi,

    Klausi schrieb:

    Ich rufe inerhalb einen Formulas einen Thread auf von dem aus ich auch Controls von diesem Form steuern wollte.

    Solche Aufrufe sollten über Control.Invoke ausgeführt werden.
    Also entweder machst Du das betreffende Control in der Thread-Klasse bekannt (Referenz) und setzt ein Aufruf von Control.Invoke aus der Thread-Methode ab oder Du definierst ein/einen Event/Delegaten in Deiner Thread-Klasse und bindest Methoden des Formulars an diese. Auch in dem letzten Fall sollte der Aufruf über Control.Invoke erfolgen, wenn Du eine asynchrone Abarbeitung des jeweiligen Befehls erreichen willst.



  • Kannst du mir das evl. an einem Beispiel erklären?



  • Klausi schrieb:

    Kannst du mir das evl. an einem Beispiel erklären?

    Eine Möglichkeit (das währe die zweite Variante, aus meinem letzten Beitrag):

    public delegate void ThreadSyncDel(MyThreadClass);
    class MyThreadClass
    {
        //...
    
        //Event, über welchen eine "Nachricht" des Threads an das Formular geht
        public event ThreadSyncDel FormSync;
    
        private int ProgressValue=0;    //Fortschrittsanzeige oder so
    
        //die eigentliche Thread-Methode
        public void WorkerMethod()
        {
            while (...)
            {
                //mach irgend was
                //...
    
                ProgressValue++;
                //Form informieren
                if (FormSync != null)
                {
                    FormSync(this);
                }
            }
        }
    }
    

    Ein Stück des Formular-Codes:

    private void NotSyncronizedHandler(MyThreadClass Sender)
    {
        Invoke(new ThreadSyncDel(SyncronizedHandler), new object[]{Sender});
    }
    
    //ist synchronisiert ==> wird erst aufgerufen, wenn der Formular-Thread "Zeit hat"
    private void SyncronizedHandler(MyThreadClass Sender)
    {
        ProgressBar.Value = Sender.ProgressValue;
    }
    
        //...
        //Thread-Objekt erzeugen
        MyThreadClass MyThreadObject = new MyThreadClass();
        //den eigentlichen Thread erzeugen
        Thread MyThread = new Thread(new ThreadStart());
        //den Thread mit einem Handler des Formulars verbinden
        MyThread.FormSync += new ThreadSyncDel(NotSyncronizedHandler);
    

    Das ist alles ungetestet und ohne Gewähr.



  • Lauft alles super durch bist auf

    public delegate void ThreadSyncDel(MyThreadClass);
    

    er meint ihm fehlt ein Erkennungszeichen. Ich habe es schon mit

    public delegate void ThreadSyncDel(MyThreadClass sender);
    

    Versucht aber dann meint er:

    Parametertyp 'Prog.Namespace.MyThreadClass' ist weniger zugreifbar als Delegat 'Prog.Namespace.ThreadSyncDel'

    Ich weiß nich was ich da falsch mache.



  • Klausi schrieb:

    Parametertyp 'Prog.Namespace.MyThreadClass' ist weniger zugreifbar als Delegat 'Prog.Namespace.ThreadSyncDel'

    Da fehlt dann wohl das public vor der Klassendeklaration.



  • Mh das lauft zwar (also ohne Fehler usw.). Aber ich würde aber lieber das Control in dem Thread bekannt machen. Weil mir das Irgent wie logischer rüber kommt. Und ich dann nicht für jeden kleinen mist diese Funktion aufrufen müste. Kannst mir das evl auch zeigen 😉



  • Klausi,

    Klausi schrieb:

    Aber ich würde aber lieber das Control in dem Thread bekannt machen. Weil mir das Irgent wie logischer rüber kommt.

    das ist Geschmackssache. Man könnte auch argumentieren, daß Controls in einem Hintergrund-Thread nichts zu suchen haben.

    Klausi schrieb:

    Kannst mir das evl auch zeigen 😉

    Ich bin einigermaßen optimistisch, daß Du das durch ein wenig Nachdenken jetzt auch selber hinbekommst :D.


Anmelden zum Antworten