Kann meinen Thread nicht beenden - Objekt ist null?!

kenny_lebt

Grünschnabel
Hi,

ich bin neu im Forum und bedanke mich im Voraus für eure Hilfe!

Also ich habe folgendes Problem:

Ich erzeuge in der Klasse FTDI folgendes Objekt Reader (FTDIReadThread). Anschließend
starte ich mit this.Reader.StartThread(); den gewünschten Thread und soweit funktioniert auch alles. Rufe ich jetzt jedoch die Methode erzeugtesObjekt.close() (in FTDI enthalten auf) kennt er das Reader-Objekt nicht (es ist null), obwohl es mit public/private FTDIReadThread Reader; korrekt deklariert wurde. D.h. mein Thread läuft weiter..


Code:
public abstract class FTDIThreadControl
    {
        private readonly object locker = new object();
        private bool stopRequired = false;
        private bool isStopped = false;

        public bool IsStopped
        {
            get
            {
                lock (locker) { return isStopped; }
            }
            protected set
            {
                lock (locker) { isStopped = value; }
            }
        }

        public bool IsStopping
        {
            get
            {
                lock (locker) { return stopRequired; }
            }
        }

        public void Stop()
        {
            lock (locker) { this.stopRequired = true; }
        }
    }

Code:
class FTDI
    {
        private int OK = 0;
        private int ERROR = 1;

        private FT_HANDLE ftHandle;
        public FTDIReadThread Reader;

        /// <summary>
        /// Öffnet eine Verbindung und startet den Thread..
        /// </summary>
        public int open()
        {

            //Öffnet das USB-Gerät..
            FTDIInterface.FT_STATUS ftStatus;
            ftStatus = FTDIInterface.FT_Open(0, ref ftHandle);

            //..und startet wenn alles OK war den Thread.
            if (ftStatus == FTDIInterface.FT_STATUS.FT_OK)
            {
                this.Reader = new FTDIReadThread(ftHandle);

                this.Reader.StartThread();

                return OK;
            }
            else
                return ERROR;
        }

        /// <summary>
        /// Beendet den Thread und schließt eine offene Verbindung..
        /// </summary>
        public int close()
        {

            FTDIInterface.FT_STATUS ftStatus;

            this.Reader.EndThread();

            this.Reader = null;

            ftStatus = FTDIInterface.FT_Close(ftHandle);

            if (ftStatus == FTDIInterface.FT_STATUS.FT_OK)
                return OK;
            else
                return ERROR;
        }


Code:
class FTDIReadThread : FTDIThreadControl
{

        Thread backgroundThread;
        FT_HANDLE ftHandle;
        
        public void StartThread()
        {
            if (this.backgroundThread == null || (this.backgroundThread != null &&          
                                                               !this.backgroundThread.IsAlive))
            {

                this.backgroundThread = new Thread(new ThreadStart(this.read));
                this.backgroundThread.IsBackground = true;
                this.backgroundThread.Name = "RXThread";

                this.backgroundThread.Start();
            }

        }

        public void EndThread()
        {
            base.Stop();
        }

        private void read()
        { ...
            try
            {
                while (!base.IsStopping)
                {
                    if (base.IsStopping)
                        break;

            ...

            finally
            {
                base.IsStopped = true;
             }
        }
}

Bitte um Hilfe! Bin schon ziemlich verzweifelt..

Vielen Dank

kenny_lebt
 

Neue Beiträge

Zurück