Avatar billede pede15 Nybegynder
16. april 2004 - 00:03 Der er 5 kommentarer og
1 løsning

Problem med en "tråd" (thread) får NullReferenceException!

Jeg vil ikke prøve at beskrive det... er ikke alt for "sharp" til C# :)

-----------------------------------------------------------------
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;

namespace MyToolbar
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Threading.Thread t;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // label1
            //
            this.label1.Location = new System.Drawing.Point(8, 8);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(80, 16);
            this.label1.TabIndex = 0;
            this.label1.Text = "Screen width:";
            //
            // label2
            //
            this.label2.Location = new System.Drawing.Point(128, 8);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(80, 16);
            this.label2.TabIndex = 1;
            this.label2.Text = "Screen height:";
            //
            // textBox1
            //
            this.textBox1.Location = new System.Drawing.Point(8, 24);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 2;
            this.textBox1.Text = "";
            //
            // textBox2
            //
            this.textBox2.Location = new System.Drawing.Point(128, 24);
            this.textBox2.Name = "textBox2";
            this.textBox2.TabIndex = 3;
            this.textBox2.Text = "";
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(8, 56);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(128, 23);
            this.button1.TabIndex = 4;
            this.button1.Text = "Get screen dimensions";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // button2
            //
            this.button2.Location = new System.Drawing.Point(8, 88);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(224, 32);
            this.button2.TabIndex = 5;
            this.button2.Text = "Exit";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(240, 549);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "Form1";
            this.Text = "Form1";
            this.TopMost = true;
            this.Width = 240;
            this.Load += new System.EventHandler(this.Form1_Load);
            this.MouseEnter += new System.EventHandler(this.Form1_MouseEnter);
            this.ResumeLayout(false);
           
        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }


        public void Form1_MouseEnter(object sender, System.EventArgs e)
        {
            ShowToolbar();
           
            Thread t = new Thread(new ThreadStart(GetMousePosition));
            t.Name = "mpThread";
            t.IsBackground  = true;
            t.Start();
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            HideToolbar();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            textBox1.Text = Screen.PrimaryScreen.WorkingArea.Width.ToString();
            textBox2.Text = Screen.PrimaryScreen.WorkingArea.Height.ToString();
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }
       
        private void GetMousePosition()
        {
            Point MousePosition = new Point();

            while(true)
            {           
                if(Control.MousePosition.X < this.Location.X)
                {
                    HideToolbar();
                    try
                    {
                        t.Abort();
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show("Error: "+ex);
                    }
                }
                else
                {
                    this.ShowToolbar();
                }
            }
        }

        private void ShowToolbar()
        {
            this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 240, 0);
        }

        private void HideToolbar()
        {
            this.Height = Screen.PrimaryScreen.WorkingArea.Height;
            this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width -10, 0);
        }
    }
}


----------------------------------------------------------------
Får følgende fejl:

System.NullReferenceException: Object reference not set to an instance of an object at MyToolbar.Form1.GetMousePosition() in ... line 187  ->    t.Abort();

- Håber nogen kan forklare mig hvad jeg har gjort galt :)
Avatar billede roger Nybegynder
16. april 2004 - 01:04 #1
Du har i hvert tilfælde lavet en fejl her:
Thread t = new Thread(new ThreadStart(GetMousePosition));

i følge din kode skal det være:

t = new Thread(new ThreadStart(GetMousePosition));

Du har deklareret t længere oppe.

Endvidere skal du huske at lade din gui-tråd håndtere alt hvad der har med gui at gøre.

Der skal du kigge lidt på invoke-metoden på dine controls.
Avatar billede roger Nybegynder
16. april 2004 - 01:06 #2
Glemte at skrive at du kan bruge System.Threading.Thread.CurrentThread i stedet for at bruge t.
Avatar billede arne_v Ekspert
16. april 2004 - 07:24 #3
Det er yden tvivl det at den lokale t skygger for instans variabeln der giver
den null pointer exception. t i t.abort() er jo instans variabel t.
Avatar billede pede15 Nybegynder
19. december 2004 - 09:47 #4
Ehh, okay jeg skrottede det lille projekt her - men hvis i vil have pointene så læg svar.
Avatar billede arne_v Ekspert
19. december 2004 - 10:15 #5
det må være rogers
Avatar billede pede15 Nybegynder
12. juli 2005 - 11:10 #6
Jeg nupper dem selv... tror ikke Roger følger med længere :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester