Constantine
Constantine

Reputation: 164

Update a form after Application.Run()

Here is what i want to do

// pseudo code
Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Form1 myForm = new Form1();
Application.Run(myForm); 
while(true)
{
    string a = readline();
}
form1.show(a)

In other words , I need the form always show the input. but the code above will stop after 'Application.Run(myForm);'. The reason I don't write such code in the form1 class is the main part of code is run on a machine learning engine written in F#, and because F# doesn't have a good visual designer. So I am trying to create a simple form1.dll, and use it to plot the result over time. So my problem is I only can initialise the form, but I can't update it over time. Any hints will be appreciated.

Upvotes: 2

Views: 1501

Answers (1)

Thomas Weller
Thomas Weller

Reputation: 59238

You're trying to do 2 things at the same time, so your application should reflect that by using 2 threads. Next, the Form's Show() method does not accept a string, so you need to implement your own method.

Here's a C# 2.0 WinForms solution. The program runs the thread and processes the console input:

static class Program
{
    [STAThread]
    private static void Main()
    {
        // Run form in separate thread
        var runner = new FormRunner();
        var thread = new Thread(runner.Start) {IsBackground = false};
        thread.Start();

        // Process console input
        while (true)
        {
            string a = Console.ReadLine();
            runner.Display(a);
            if (a.Equals("exit")) break;
        }
        runner.Stop();
    }
}

The FormRunner takes care about thread invocation:

internal class FormRunner
{
    internal Form1 form = new Form1();

    internal void Start()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(form);
    }

    private delegate void StopDelegate();

    public void Stop()
    {
        if (form.InvokeRequired)
        {
            form.Invoke(new StopDelegate(Stop));
            return;
        }
        form.Close();
    }

    private delegate void DisplayDelegate(string s);

    public void Display(string s)
    {
        if (form.InvokeRequired)
        {
            form.Invoke(new DisplayDelegate(form.Display), new[] {s});
        }
    }
}

And Form1 just needs something to display:

    public void Display(string s)
    {
        textBox1.Multiline = true;
        textBox1.Text += s;
        textBox1.Text += Environment.NewLine;
    }

Upvotes: 2

Related Questions