showing form from thread
-
Hi In my application, the Main form starts a thread in another class. In this thread I need to show another form as modeless. If i call it in the thread, the form shows but in a hanged state. no controls are visible and it is in not responding state. How can i achieve my requirement. Please help. Thanks.
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(
new System.Threading.ThreadStart(delegate
{
Form1 frm = new Form1();
frm.ShowDialog();
}));
t.Start();
}That seems to work for me.
-
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(
new System.Threading.ThreadStart(delegate
{
Form1 frm = new Form1();
frm.ShowDialog();
}));
t.Start();
}That seems to work for me.
It may work for you, but it's not going to work in all instances and environments and it WILL produce bugs that are difficult, if not impossible, to track down. The short answer is you just don't put up UI elements on anything other than the UI thread.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007, 2008
But no longer in 2009... -
It may work for you, but it's not going to work in all instances and environments and it WILL produce bugs that are difficult, if not impossible, to track down. The short answer is you just don't put up UI elements on anything other than the UI thread.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007, 2008
But no longer in 2009...Dave Kreskowiak wrote:
it WILL produce bugs
You sure about that? Do you have a concrete example?
-
Dave Kreskowiak wrote:
it WILL produce bugs
You sure about that? Do you have a concrete example?
There's no such thing as a "concrete" example of this. All you have to do is ask around.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007, 2008
But no longer in 2009... -
There's no such thing as a "concrete" example of this. All you have to do is ask around.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007, 2008
But no longer in 2009...Word on the street, huh? Oooooo....k.
-
Word on the street, huh? Oooooo....k.
Ask around HERE. You want the professional experience behind it? Ask around HERE. Don't take just my word for it. Ask everyone with an MVP icon next to their name.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
2006, 2007, 2008
But no longer in 2009... -
Word on the street, huh? Oooooo....k.
Ask anyone who have ever done anything with threading. The most common bug I come across where I work is anything accessing the UI from another thread, either creating stuff, or just calling methods and properties across threads. It is worth noting that the debug environment runs in a rather safe mode (somehow) and so threading issues rarely show up during development, unless they are really bad. Worse, you cannot step through them easily as the timing of actions on different threads makes a big difference. In my experience 50% of threading issues break the application on the first time they are run in a release environment. Of the other 50% it depends on the hardware and network environment. We had a threading issue that only came to light a year after release when the end user upgraded their machine. Suddenly one of the threads ran faster (probably off on another core, or just from the faster processor) and the bug climbed out of hiding. World of pain!
If you have knowledge, let others light their candles at it. Margaret Fuller (1810 - 1850) [My Articles] [My Website]
-
Dave Kreskowiak wrote:
it WILL produce bugs
You sure about that? Do you have a concrete example?
Bug number 1. You used
ShowDialog
which should produce a modal dialog, however it is modeless, due to running on a separate thread. Therefore you can spawn hundreds of these secondary dialogs, oops. Not an execution bug in this case, but clearly a process flow bug. Having said that changing your code toShow
doesn't produce any visible form at all.If you have knowledge, let others light their candles at it. Margaret Fuller (1810 - 1850) [My Articles] [My Website]
-
You have to create all your forms on the GUI thread, of which there can only be one in the application. I suggest you invoke a method back onto the Main Form thread to create the new modeless form.
If you have knowledge, let others light their candles at it. Margaret Fuller (1810 - 1850) [My Articles] [My Website]
I tried calling a delegate.BeginInvoke in the thread for the main form in which i called the new form.show. but same results. the new form is in hanged state.
-
I tried calling a delegate.BeginInvoke in the thread for the main form in which i called the new form.show. but same results. the new form is in hanged state.
BeginInvoke
is not needed as theShow
is not going to block any threads. Just callMainForm.Invoke
with the delegate to show the newForm. eg.Thread thread = new Thread(new ThreadStart(StartNewThread)); thread.Start(); } void StartNewThread(){ //Application.Run(new Form2()); this.Invoke(new MethodInvoker(this.LaunchForm2)); } void LaunchForm2(){ Form2 frm = new Form2(); frm.Show(); }
I know as a standalone example my code would be daft, why start a new thread just to invoke back to the original thread, but I assume you are doing some other processing in the secondary thread to make it worthwhile.
If you have knowledge, let others light their candles at it. Margaret Fuller (1810 - 1850) [My Articles] [My Website]