Re: Application.Run()

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



That's excellent, thanks for the information!
I appreciate that you have trawled back through the posts to answer this
question that was left unanswered so long ago.

Many, many thanks.

UchihaJax (Simon)

"Richard Grimes" <richardg@xxxxxxxx> wrote in message
news:uG8hGoo0FHA.3660@xxxxxxxxxxxxxxxxxxxxxxx
> Uchiha Jax wrote:
> > What exactly is the "standard application message loop" (from MS
> > documentation:
> >
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsApplicationClassRunTopic.asp)
> > and how does this differ to a standard thread event model?
> > Are there ways in which you can find out if an object requires the
> > "standard application message loop" other than trial and error?
> > Does anyone have any other information on this subject as I find it a
> > fascinating situation.
>
> new Form();
>
> just creates a form object, it does not create the form window
>
> Form f = new Form();
> f.Visible = true;
>
> the second line will create the window. In this property accessor a
> Win32 window class is registered, then a window is created. Every window
> has to have a windows procedure that handles messages. The messages are
> put into a queue for the thread and a loop on the thread calls
> GetMessage() to get a message from this queue and then passes it to the
> windows procedure by calling DispatchMessage().
>
> There is another aspect that you should be aware of. If a thread
> procedure returns, the thread dies. So if your application has just one
> thread, your application will live as long as the thread lives. (This
> assumes that the thread is a foreground thread.) Even if the application
> has a window and you have *not* clicked on the close button, if the
> thread procedure finishes then the application will die. Try this:
>
> class App
> {
> static void Main()
> {
> Form f = new Form();
> f.Visible = true;
> }
> }
>
> What happens? The form shows briefly and then goes away. The reason is
> that the window is created but the thread procedure completes so the
> process dies and the window is destroyed. Also, this window will not
> respond to windows messages. to get round this you can add a call to
> Application.Run() after the call to set the Visible property.
>
> Now the window will remain, because Run implements a
> GetMessage/DispatchMessage loop, so the main thread does not die. The
> loop also means that the form will handle messages sent by the OS.
> However there is a problem. If you click on the close button of the
> form, the window will go away, but if you run task manager you'll see
> that the process is still running. The problem is that the Visible set
> accessor provides a windows procedure that handles the click on the
> close button to close the window, but this windows procedure has no
> connection to the application - it cannot tell the application to end.
> This needs something called an application context, which is a
> connection between the window and the message queue. If you pass the
> form object to Application.Run an application context will be created. I
> won't go into the details, but basically the application context is
> based on the form, and if the form dies the application context breaks
> the message loop and so the process dies. If the message queue dies then
> the application context tells the form object (as opposed to the window)
> to allow your code to clean up (Dispose is called).
>
> Thus the life of the process is determined by the life of the form. Any
> other form in the application will not have the application context and
> so will not kill the process when it is closed.
>
> > I found I could "fix" my test by putting Application.Run at the end
> > of the thread that initializes the object. This is of course
> > equivalent to loading it into a Form and running the same thread in
> > the LoadEvent of the form. Having never encountered this problem
> > before I had some questions that I wondered if anyone could help me
> > understand.
>
> Hopefully the above will explain what's going on.
>
> I wrote an article for DDJ about this, but unfortunately you have to
> register to read it:
>
> http://www.ddj.com/documents/s=9698/ddj0505l/0505l.html
>
> I am considering writing a workshop on how windows forms work (on the
> lines of my workshops on Fusion and on Security), but to be honest at
> the moment I'm quite pissed off with Microsoft so I don't seem to have
> any incentive to do so.
>
> Richard
> --
> http://www.grimes.demon.co.uk/workshops/fusionWS.htm
> http://www.grimes.demon.co.uk/workshops/securityWS.htm
>
>


.



Relevant Pages

  • Re: Application.Run()
    ... the second line will create the window. ... has to have a windows procedure that handles messages. ... process dies and the window is destroyed. ... form object to Application.Run an application context will be created. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: kmix crash after adding tv card
    ... Now sorted (ish). ... AllowDocking is true, it dies when started. ... least runs in its own window without problems. ...
    (comp.os.linux.setup)
  • Has somebody made a surveillance thread which doesnt die?
    ... I have a log-in window application. ... the mother-thread dies, and can't be killed in the task manager. ... kill the other window and then exit. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: When did Batmans no Killing code really start?
    ... gangsters to death, throws a mad scientist out a window and assumes he ... dies ... other to death cause they were better off that way... ...
    (rec.arts.comics.dc.universe)
  • Re: Why cant I see static variables in debug window
    ... Auto pane of the variable window, because you're about to use it (to add ... you can use the Locals pane to see everything... ... if you're *using* the static in the context where you ... Variables debug window, the value of the variable x does not show. ...
    (microsoft.public.windowsce.embedded)