Avatar billede larsny Nybegynder
05. oktober 2006 - 13:41 Der er 5 kommentarer og
1 løsning

Asynkrone tråde?

Jeg ønsker at starte ud med et lille simpelt program.

Vi har hovedprogrammet der styre det hele "engine", og så vil jeg have en form der kører asynkront ved siden af.

Hovedprogrammet her skal bare tålle en counter op.
Formen skal så kunne kalde en funktion der returnerer counteren til formen som den så skriver ud på en label.

Hovedprogrammet og formen skal på den måde kunne køre hinandens funktioner.

F.eks. hovedprogrammet skal kunne lukke formen, samt formen skal kunne lukke hovedprogrammet.

Nogen der kan hjælpe med et simpelt eksempel på dette?

På forhånd tak
Avatar billede bulgroz Nybegynder
06. oktober 2006 - 10:03 #1
Som jeg kan forstådet så har du tre dele.

Et "styreprogram" til at kontrollere hvad der skal ske.
En tæller klasse
Samt et "Display" hvilket er din form.

Letteste løsning er at dit styreprogram laver en instans af din tællerklasse.

Tællerklassen har fornødne metoder/properties til start stop osv. Og har derudover også events så som CounterTick etc...

Styreformen opretter derefter en instans af din Display form og vidergiver tællerklassen som parameter.

Display formen skal derefter blot lytte til de fornødne events og opdaterer labels herved.


Din tæller klasse kan naturligvis have asynkrone operationer (det kommer jo an på hvad den skal lave). Disse kan i de fleste tilfælde klares led ved at anvende en BackgroundWorker.
Avatar billede bulgroz Nybegynder
06. oktober 2006 - 10:52 #2
Hvis jeg har forstået din problemstilling korrekt, så er her et lille eksempel jeg har bryggettildig.
Eksemplet har en "Kontrol" form. En tæller klasse (her et stopur). Samt en Displayform.

Alt styres fra Kontrol formen.

namespace DisplayExample
{
    using System;
    using System.Windows.Forms;
    using System.Diagnostics;

    public class ControllerForm : Form
    {
        private System.Windows.Forms.Button buttonStart;
        private System.Windows.Forms.Button buttonStop;
        private Button buttonNewDisplay;

        private MyStopWatch stopWatch = new MyStopWatch();

        public ControllerForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void ButtonNewDisplayClick(object sender, EventArgs e)
        {
            DisplayForm displayForm = new DisplayForm(this.stopWatch);
            displayForm.Show();
        }

        private void ButtonStartClick(object sender, EventArgs e)
        {
            this.stopWatch.Start();
        }

        private void ButtonStopClick(object sender, EventArgs e)
        {
            this.stopWatch.Stop();
        }

        #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.buttonStart = new System.Windows.Forms.Button();
            this.buttonStop = new System.Windows.Forms.Button();
            this.buttonNewDisplay = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // buttonStart
            //
            this.buttonStart.Location = new System.Drawing.Point(13, 13);
            this.buttonStart.Name = "buttonStart";
            this.buttonStart.Size = new System.Drawing.Size(75, 23);
            this.buttonStart.TabIndex = 0;
            this.buttonStart.Text = "Start";
            this.buttonStart.UseVisualStyleBackColor = true;
            this.buttonStart.Click += new System.EventHandler(this.ButtonStartClick);
            //
            // buttonStop
            //
            this.buttonStop.Location = new System.Drawing.Point(95, 13);
            this.buttonStop.Name = "buttonStop";
            this.buttonStop.Size = new System.Drawing.Size(75, 23);
            this.buttonStop.TabIndex = 1;
            this.buttonStop.Text = "Stop";
            this.buttonStop.UseVisualStyleBackColor = true;
            this.buttonStop.Click += new System.EventHandler(this.ButtonStopClick);
            //
            // buttonNewDisplay
            //
            this.buttonNewDisplay.Location = new System.Drawing.Point(12, 54);
            this.buttonNewDisplay.Name = "buttonNewDisplay";
            this.buttonNewDisplay.Size = new System.Drawing.Size(75, 23);
            this.buttonNewDisplay.TabIndex = 2;
            this.buttonNewDisplay.Text = "New Display";
            this.buttonNewDisplay.UseVisualStyleBackColor = true;
            this.buttonNewDisplay.Click += new System.EventHandler(this.ButtonNewDisplayClick);
            //
            // ControllerForm
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.AutoSize = true;
            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.ClientSize = new System.Drawing.Size(197, 89);
            this.Controls.Add(this.buttonNewDisplay);
            this.Controls.Add(this.buttonStop);
            this.Controls.Add(this.buttonStart);
            this.Name = "ControllerForm";
            this.Text = "Example";
            this.ResumeLayout(false);

        }

        #endregion
    }

    /// <summary>
    /// Example Counter
    /// </summary>
    public class MyStopWatch
    {
        private Timer notifyTimer = new Timer();
        private Stopwatch stopwatch = new Stopwatch();

        public event EventHandler<MyTickEventArgs> Tick;

        public MyStopWatch()
        {
            this.notifyTimer.Interval = 500; // Bestemmer hvor ofte dit UI bliver opdateret.
            this.notifyTimer.Tick += new EventHandler(this.NotifyTimerTick);
        }

        void NotifyTimerTick(object sender, EventArgs e)
        {
            // Thread-safe way to raise the TimerTickEvent event.
            EventHandler<MyTickEventArgs> handler = this.Tick;

            if (handler != null)
            {
                handler(this, new MyTickEventArgs(this.stopwatch.Elapsed));
            }
        }

        public void Start()
        {
            this.notifyTimer.Start();
            this.stopwatch.Start();
        }

        public void Stop()
        {
            this.notifyTimer.Stop();
            this.stopwatch.Stop();
        }
    }

    public class MyTickEventArgs : EventArgs
    {
        private TimeSpan ellapsedTimeSpan;

        internal MyTickEventArgs(TimeSpan ellapsedTime)
        {
            this.ellapsedTimeSpan = ellapsedTime;
        }

        public TimeSpan EllapsedTime
        {
            get
            {
                return this.ellapsedTimeSpan;
            }
        }
    }

    public class DisplayForm : Form
    {
        private MyStopWatch stopWatch;
        private System.Windows.Forms.Label label;
        private System.ComponentModel.IContainer components = null;

        public DisplayForm(MyStopWatch stopWatch)
        {
            InitializeComponent();

            if (stopWatch == null)
            {
                throw new ArgumentNullException("stopWatch");
            }

            this.stopWatch = stopWatch;
            this.stopWatch.Tick += new EventHandler<MyTickEventArgs>(StopWatchTick);
        }

        void StopWatchTick(object sender, MyTickEventArgs e)
        {
            this.label.Text = e.EllapsedTime.ToString();
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (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.label = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // label
            //
            this.label.AutoSize = true;
            this.label.Dock = System.Windows.Forms.DockStyle.Fill;
            this.label.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label.Location = new System.Drawing.Point(0, 0);
            this.label.Name = "label";
            this.label.Size = new System.Drawing.Size(0, 31);
            this.label.TabIndex = 0;
            //
            // DisplayForm
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.AutoSize = true;
            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.ClientSize = new System.Drawing.Size(272, 126);
            this.Controls.Add(this.label);
            this.Name = "DisplayForm";
            this.Text = "DisplayForm";
            this.ResumeLayout(false);
            this.PerformLayout();
        }

        #endregion
    }
}
Avatar billede larsny Nybegynder
09. oktober 2006 - 18:55 #3
perfekt!

Efter at have kigget på det weekenden over, har jeg endelig fået det til at virke :)

lige det der med opdeling af filer osv :)

smid et svar
Avatar billede larsny Nybegynder
09. oktober 2006 - 21:13 #4
jeg skal lige høre..

er det muligt at åbne en form via en service?

har nemlig tænkt mig at bruge det til en service der ligger og kører noget systemwatcher i baggrunden, og når der så sker noget, skal den åbne en form
Avatar billede bulgroz Nybegynder
09. oktober 2006 - 23:42 #5
Det burde der ikke være noget til hindring for.
Efter at din instans af formen er oprettet, vises den med Form.Show eller Form.ShowDialog alt afhængigt af om den skal være mordal eller ej.
Avatar billede larsny Nybegynder
10. oktober 2006 - 08:40 #6
Ok jeg må se noget mere på det.

Det virker bare som om den går i en form for uendelig løkke, men det må jeg lave et nyt spørgsmål om hvis jeg ikke kan få det til at virke :)

tak for det!
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