05. oktober 2006 - 13:41Der 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?
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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.
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 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;
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.
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!
Synes godt om
Ny brugerNybegynder
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.