Avatar billede ahara Nybegynder
30. april 2005 - 14:08 Der er 5 kommentarer og
2 løsninger

Hvordan benytter jeg en tråd i min button_click funktion?

Hej

Jeg har forsøgt at oprette en form med 2 knapper. Jeg vil bruge 2 tråde til at køre 2 forskellige funktioner afhængigt af hvilken knap jeg trykker på.
Trykkes der på knap nr 1. skal den starte tråd 1 og deaktivere tråd 2. Men hvordan gøres det?
Som i kan se af min kode opretter jeg de to tråde og starter dem i button_click funktionerne, men den går ikke. Hvordan ligger jeg dem udenfor funktionerne og benytter Thread.Start() inden i funktionerne. Det er nok noget med at sende tråd objektet med som reference.

Mvh
AHR

******* Min Kode *******

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

namespace simpeltTest
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Label label1;
        /// <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>
        public void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(24, 200);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // button2
            //
            this.button2.Location = new System.Drawing.Point(24, 160);
            this.button2.Name = "button2";
            this.button2.TabIndex = 1;
            this.button2.Text = "button2";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            //
            // label1
            //
            this.label1.Location = new System.Drawing.Point(136, 184);
            this.label1.Name = "label1";
            this.label1.TabIndex = 2;
            this.label1.Text = "Counter";
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]

        static void Main()
        {

            Form1 myform=new Form1();
            //myform.ShowDialog();

            Application.Run(myform);
        }
       
        public void threadMetodeOne()
        {
            int counter=0;

            while(counter<10)
            {
                label1.Text = counter.ToString();
                label1.Refresh();
                Thread.Sleep(1000);
                counter++;
            }
        }

        public void threadMetodeTwo()
        {
            label1.Text = "Nulstillet";
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            Thread taeller = new Thread(new ThreadStart(threadMetodeOne));   
            taeller.Start();
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            Thread nulstil = new Thread(new ThreadStart(threadMetodeTwo));   
            nulstil.Start();
        }
    }
}
Avatar billede spif2001 Nybegynder
30. april 2005 - 15:15 #1
Kan du ikke lave de to tråde til globale variable, initialisere dem i constructoren, og så nøjes med at kalde start() i click funktionerne?
Avatar billede ahara Nybegynder
30. april 2005 - 16:17 #2
Kan du vise mig hvordan i min kode?
Avatar billede www.jakub.dk Nybegynder
01. maj 2005 - 00:32 #3
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;

namespace simpeltTest
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Label label1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
     
        private System.ComponentModel.Container components = null;

        private Thread taeller;
        private Thread nulstil;     

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

            taeller = new Thread(new ThreadStart(threadMetodeOne));
            nulstil = new Thread(new ThreadStart(threadMetodeTwo));

            //
            // 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>
        public void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // button1
            //
            this.button1.Location = new System.Drawing.Point(24, 200);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            //
            // button2
            //
            this.button2.Location = new System.Drawing.Point(24, 160);
            this.button2.Name = "button2";
            this.button2.TabIndex = 1;
            this.button2.Text = "button2";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            //
            // label1
            //
            this.label1.Location = new System.Drawing.Point(136, 184);
            this.label1.Name = "label1";
            this.label1.TabIndex = 2;
            this.label1.Text = "Counter";
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]

        static void Main()
        {

            Form1 myform=new Form1();
            //myform.ShowDialog();

            Application.Run(myform);
        }
     
        public void threadMetodeOne()
        {
            int counter=0;

            while(counter<10)
            {
                label1.Text = counter.ToString();
                label1.Refresh();
                Thread.Sleep(1000);
                counter++;
            }
        }

        public void threadMetodeTwo()
        {
            label1.Text = "Nulstillet";
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            taeller.Start();
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            nulstil.Start();
        }
    }
}

Jeg gjorde bar det spif2001 sagde... Vær så god
Avatar billede www.jakub.dk Nybegynder
01. maj 2005 - 00:36 #4
Du skal så stoppe det andet tråd... Men vil du helt afslutte den eller vil du bare pause den.
Hvis du skal afslutte den så kan du gøre følgenede under Click handlerne:

private void button1_Click(object sender, System.EventArgs e)
        {
            nulstil.Abort();
            taeller.Start();
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            tealler.Abort();
            nulstil.Start();
        }

Eller hvis du kun vil pause trådene og starte dem igen:

private void button1_Click(object sender, System.EventArgs e)
        {
          nulstil.Suspend();
          taeller.Resume();
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
          tealler.Suspend();
          nulstil.Resume();
        }
Avatar billede ahara Nybegynder
03. maj 2005 - 22:11 #5
Tak for hjælpen og et svar fra dig så er der point
Avatar billede www.jakub.dk Nybegynder
03. maj 2005 - 22:59 #6
svar
Avatar billede www.jakub.dk Nybegynder
04. maj 2005 - 12:43 #7
svar
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