Nu påstår Martin, at man kan løse dit problem med Singleton. Det er ikke tilfældet. Singleton kan bruges til at få adgang til din Form klasse fra en ny klasse, men det kan ikke løse dit cross thread problem.
Hvis du har følgende kode i din form klasse
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
-
- namespace ThreadTest
- {
- public partial class MainForm : Form
- {
- private static MainForm instance;
-
- private MainForm()
- {
- InitializeComponent();
- }
-
- public static MainForm GetInstance()
- {
- if (instance == null)
- {
- instance = new MainForm();
- }
- return instance;
- }
-
- private void StartThread_Click(object sender, EventArgs e)
- {
- new Thread(new ThreadStart(ProgressbarStart)).Start();
- }
-
- delegate void Invoker();
-
- public void IncreaseProcessBar()
- {
- //If you leave out the InvokeRequired test you will get an Exception
- if (this.InvokeRequired)
- {
- BeginInvoke(new Invoker(IncreaseProcessBar));
- }
- else
- {
- ProcessIndicator.Increment(1);
- }
- }
-
- private void ProgressbarStart()
- {
- for (int i = 0; i < 100; i++)
- {
- Thread.Sleep(100);
- MainForm.GetInstance().IncreaseProcessBar();
- }
- }
- }
- }
Og ændrer din klasse indeholdende din Main metode
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
-
- namespace ThreadTest
- {
- static class Program
- {
- /// <summary>
- /// The main entry point for the application.
- /// </summary>
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- //Application.Run(new MainForm());
- Application.Run(MainForm.GetInstance());
- }
- }
- }
Så kan du flytte din ProgressbarStart metode til en anden klasse, men den vil stadig have adgang til Form klassen via Singleton.
Indlæg senest redigeret d. 02.01.2009 20:34 af Bruger #13106