Thread overview
WINIO Shutdown Hangup
Jul 18, 2001
Mark Evans
Jul 18, 2001
Andrew Schulman
Jul 18, 2001
Mark Evans
Jul 18, 2001
Mark Evans
Jul 19, 2001
Walter
Jul 22, 2001
Kar Gay Lim
Jul 19, 2001
Mark Evans
Jul 19, 2001
Walter
Jul 23, 2001
Mark Evans
Feb 23, 2006
Chris Johnson
July 18, 2001
I have a problem closing WINIO windows at application shutdown time.  When I quit, WINIO "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid of it.  Windows 98 also issues a number of warning messages.

The structure of my application main loop is very simple.  It's an infinite loop with a global flag signaling "stop."  Here is the pseudo-code:

BOOL    appClosing = FALSE;

int main(int argc, char *argv[])
{
    App_Setup(); // open windows, init world

    while (! appClosing) // loop "forever"
    {
        if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
        {
            wmhandler_yield();  // WINIO library call
            continue;
        }
        if (appClosing) break; // safety

        // Do my stuff next....could open more windows
        // or close some, could set appClosing TRUE from
        // program code
    }

    App_Cleanup(); // close windows (???), shutdown

    return 0;
}

I have one main window (the usual __hMainWnd) and other windows open.  The user can close or exit from any of them.

The problem is that only the main window is willing to close properly.  Even winio_closeall() does not get rid of the others.

I've tried several variations of wmhandler_set for WM_CLOSE, winio_onclose, etc.  I've used message handlers galore.  It seems overly difficult to set things up so that the WINIO windows all close properly when the user selects "Exit" from the file menu.

Given the application structure shown, could someone please demonstrate the "approved" method for shutting down all WINIO windows, and offer an explanation of why one of them would "hang" at shutdown.

(I do have a WM_TIMER proc running on the main window and that could contribute to my
problem.)

Thanks,

Mark



July 18, 2001
Sorry Mark, I have no idea. It's been years since I've looked at or used WINIO. Once I could do Win32 Console apps, I pretty much stopped using WINIO, even though obviously I did miss clickable lines and so on.

Regards,
Andrew

--
Andrew Schulman
Software litigation consultant
Chief Researcher, Workplace Surveillance Project, Privacy Foundation, US
http://www.undoc.com
undoc@sonic.net
http://www.privacyfoundation.org/workplace

Mark Evans wrote:

> I have a problem closing WINIO windows at application shutdown time.  When I quit, WINIO "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid of it.  Windows 98 also issues a number of warning messages.
>
> The structure of my application main loop is very simple.  It's an infinite loop with a global flag signaling "stop."  Here is the pseudo-code:
>
> BOOL    appClosing = FALSE;
>
> int main(int argc, char *argv[])
> {
>     App_Setup(); // open windows, init world
>
>     while (! appClosing) // loop "forever"
>     {
>         if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
>         {
>             wmhandler_yield();  // WINIO library call
>             continue;
>         }
>         if (appClosing) break; // safety
>
>         // Do my stuff next....could open more windows
>         // or close some, could set appClosing TRUE from
>         // program code
>     }
>
>     App_Cleanup(); // close windows (???), shutdown
>
>     return 0;
> }
>
> I have one main window (the usual __hMainWnd) and other windows open.  The user can close or exit from any of them.
>
> The problem is that only the main window is willing to close properly.  Even winio_closeall() does not get rid of the others.
>
> I've tried several variations of wmhandler_set for WM_CLOSE, winio_onclose, etc.  I've used message handlers galore.  It seems overly difficult to set things up so that the WINIO windows all close properly when the user selects "Exit" from the file menu.
>
> Given the application structure shown, could someone please demonstrate the "approved" method for shutting down all WINIO windows, and offer an explanation of why one of them would "hang" at shutdown.
>
> (I do have a WM_TIMER proc running on the main window and that could contribute to my
> problem.)
>
> Thanks,
>
> Mark



July 18, 2001
Andrew,

Fine then, has the source code been released to the public domain?

I'm not interested in fancy features of winio like clickable lines.  The whole reason I'm using it is to avoid GUI hassles.

All I care about are crash messages at shutdown -- and sometimes the stray WINIO task loop will not terminate even with several CTRL-ALT-DEL operations.

If I had the source I could figure it out for myself.....

Mark


On Wed, 18 Jul 2001 12:01:18 -0700, Andrew Schulman <undoc@sonic.net> wrote:
> Sorry Mark, I have no idea. It's been years since I've looked at or used WINIO. Once I could do Win32 Console apps, I pretty much stopped using WINIO, even though obviously I did miss clickable lines and so on.
> 
> Regards,
> Andrew
> 
> --
> Andrew Schulman
> Software litigation consultant
> Chief Researcher, Workplace Surveillance Project, Privacy Foundation, US
> http://www.undoc.com
> undoc@sonic.net
> http://www.privacyfoundation.org/workplace
> 
> Mark Evans wrote:
> 
> > I have a problem closing WINIO windows at application shutdown time.  When I quit, WINIO "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid of it.  Windows 98 also issues a number of warning messages.
> >
> > The structure of my application main loop is very simple.  It's an infinite loop with a global flag signaling "stop."  Here is the pseudo-code:
> >
> > BOOL    appClosing = FALSE;
> >
> > int main(int argc, char *argv[])
> > {
> >     App_Setup(); // open windows, init world
> >
> >     while (! appClosing) // loop "forever"
> >     {
> >         if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
> >         {
> >             wmhandler_yield();  // WINIO library call
> >             continue;
> >         }
> >         if (appClosing) break; // safety
> >
> >         // Do my stuff next....could open more windows
> >         // or close some, could set appClosing TRUE from
> >         // program code
> >     }
> >
> >     App_Cleanup(); // close windows (???), shutdown
> >
> >     return 0;
> > }
> >
> > I have one main window (the usual __hMainWnd) and other windows open.  The user can close or exit from any of them.
> >
> > The problem is that only the main window is willing to close properly.  Even winio_closeall() does not get rid of the others.
> >
> > I've tried several variations of wmhandler_set for WM_CLOSE, winio_onclose, etc.  I've used message handlers galore.  It seems overly difficult to set things up so that the WINIO windows all close properly when the user selects "Exit" from the file menu.
> >
> > Given the application structure shown, could someone please demonstrate the "approved" method for shutting down all WINIO windows, and offer an explanation of why one of them would "hang" at shutdown.
> >
> > (I do have a WM_TIMER proc running on the main window and that could contribute to my
> > problem.)
> >
> > Thanks,
> >
> > Mark
> 
> 
> 


July 18, 2001
Ah, there it is in the Digital Mars folder....thank you Digital Mars.

Mark


On Wed, 18 Jul 2001 21:13:51 GMT, Mark Evans <mevans@zyvex.com> wrote:
> Andrew,
> 
> Fine then, has the source code been released to the public domain?
> 


July 19, 2001
I'm happy to report that I have solved the problems with WINIO.

Using the WINIO source and the lovely DM line number/object address listing file, I was able to track down the General Protection Faults fairly easily (without even using a debugger).

I had to tweak the WINIO source a little bit to deal with my app closure issues properly, but all is well now.

One of the things I don't like about WINIO is the assumption that every window is somehow going to be closed by the destruction of the main window.  That is not the case.  Independent windows must be destroyed by hand.

Mark


On Wed, 18 Jul 2001 17:20:46 GMT, Mark Evans <mevans@zyvex.com> wrote:
> I have a problem closing WINIO windows at application shutdown time.  When I quit, WINIO "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid of it.  Windows 98 also issues a number of warning messages.
> 
> The structure of my application main loop is very simple.  It's an infinite loop with a global flag signaling "stop."  Here is the pseudo-code:
> 
> BOOL    appClosing = FALSE;
> 
> int main(int argc, char *argv[])
> {
>     App_Setup(); // open windows, init world
> 
>     while (! appClosing) // loop "forever"
>     {
>         if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
>         {
>             wmhandler_yield();  // WINIO library call
>             continue;
>         }
>         if (appClosing) break; // safety
> 
>         // Do my stuff next....could open more windows
>         // or close some, could set appClosing TRUE from
>         // program code
>     }
> 
>     App_Cleanup(); // close windows (???), shutdown
> 
>     return 0;
> }
> 
> I have one main window (the usual __hMainWnd) and other windows open.  The user can close or exit from any of them.
> 
> The problem is that only the main window is willing to close properly.  Even winio_closeall() does not get rid of the others.
> 
> I've tried several variations of wmhandler_set for WM_CLOSE, winio_onclose, etc.  I've used message handlers galore.  It seems overly difficult to set things up so that the WINIO windows all close properly when the user selects "Exit" from the file menu.
> 
> Given the application structure shown, could someone please demonstrate the "approved" method for shutting down all WINIO windows, and offer an explanation of why one of them would "hang" at shutdown.
> 
> (I do have a WM_TIMER proc running on the main window and that could contribute to my
> problem.)
> 
> Thanks,
> 
> Mark
> 
> 
> 


July 19, 2001
Is your solution of general interest, i.e. should it be folded back into the source?

Mark Evans wrote in message <1103_995505698@evans>...
>I'm happy to report that I have solved the problems with WINIO.
>
>Using the WINIO source and the lovely DM line number/object address listing
file, I was able to track down the General Protection Faults fairly
>easily (without even using a debugger).
>
>I had to tweak the WINIO source a little bit to deal with my app closure
issues properly, but all is well now.
>
>One of the things I don't like about WINIO is the assumption that every
window is somehow going to be closed by the destruction of the main
>window.  That is not the case.  Independent windows must be destroyed by
hand.
>
>Mark
>
>
>On Wed, 18 Jul 2001 17:20:46 GMT, Mark Evans <mevans@zyvex.com> wrote:
>> I have a problem closing WINIO windows at application shutdown time.
When I quit, WINIO
>> "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid
of it.  Windows
>> 98 also issues a number of warning messages.
>>
>> The structure of my application main loop is very simple.  It's an
infinite loop with a
>> global flag signaling "stop."  Here is the pseudo-code:
>>
>> BOOL    appClosing = FALSE;
>>
>> int main(int argc, char *argv[])
>> {
>>     App_Setup(); // open windows, init world
>>
>>     while (! appClosing) // loop "forever"
>>     {
>>         if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
>>         {
>>             wmhandler_yield();  // WINIO library call
>>             continue;
>>         }
>>         if (appClosing) break; // safety
>>
>>         // Do my stuff next....could open more windows
>>         // or close some, could set appClosing TRUE from
>>         // program code
>>     }
>>
>>     App_Cleanup(); // close windows (???), shutdown
>>
>>     return 0;
>> }
>>
>> I have one main window (the usual __hMainWnd) and other windows open.
The user can close
>> or exit from any of them.
>>
>> The problem is that only the main window is willing to close properly.
Even
>> winio_closeall() does not get rid of the others.
>>
>> I've tried several variations of wmhandler_set for WM_CLOSE,
winio_onclose, etc.  I've
>> used message handlers galore.  It seems overly difficult to set things up
so that the
>> WINIO windows all close properly when the user selects "Exit" from the
file menu.
>>
>> Given the application structure shown, could someone please demonstrate
the "approved"
>> method for shutting down all WINIO windows, and offer an explanation of
why one of them
>> would "hang" at shutdown.
>>
>> (I do have a WM_TIMER proc running on the main window and that could
contribute to my
>> problem.)
>>
>> Thanks,
>>
>> Mark
>>
>>
>>
>
>


July 19, 2001
Special thanks should go to Andrew Schulman, who graciously has allowed Digital Mars to distribute his work.

Mark Evans wrote in message <1103_995495695@evans>...
>Ah, there it is in the Digital Mars folder....thank you Digital Mars.
>
>Mark
>
>
>On Wed, 18 Jul 2001 21:13:51 GMT, Mark Evans <mevans@zyvex.com> wrote:
>> Andrew,
>>
>> Fine then, has the source code been released to the public domain?
>>
>
>


July 22, 2001
WOW!!!!

Walter wrote the compiler and Andrew Schulman is also reading this news group.... This is programmer's heaven.

Ron Burk should be in I think.

Now, let us see if we can get Petzold in as well one...


Kar Gay Lim

Andrew Schulman <undoc@sonic.net> wrote in message news:3B55DCFE.70895AD3@sonic.net...
> Sorry Mark, I have no idea. It's been years since I've looked at or used WINIO. Once I
could
> do Win32 Console apps, I pretty much stopped using WINIO, even though obviously I did
miss
> clickable lines and so on.
>
> Regards,
> Andrew
>
> --
> Andrew Schulman
> Software litigation consultant
> Chief Researcher, Workplace Surveillance Project, Privacy Foundation, US
> http://www.undoc.com
> undoc@sonic.net
> http://www.privacyfoundation.org/workplace
>
> Mark Evans wrote:
>
> > I have a problem closing WINIO windows at application shutdown time.  When I quit,
WINIO
> > "hangs" and I need several CTRL-ALT-DEL task manager shutdowns to get rid of it.
Windows
> > 98 also issues a number of warning messages.
> >
> > The structure of my application main loop is very simple.  It's an infinite loop with
a
> > global flag signaling "stop."  Here is the pseudo-code:
> >
> > BOOL    appClosing = FALSE;
> >
> > int main(int argc, char *argv[])
> > {
> >     App_Setup(); // open windows, init world
> >
> >     while (! appClosing) // loop "forever"
> >     {
> >         if ( PeekMessage(&appMessage,(HWND) NULL,0,0,PM_NOREMOVE) )
> >         {
> >             wmhandler_yield();  // WINIO library call
> >             continue;
> >         }
> >         if (appClosing) break; // safety
> >
> >         // Do my stuff next....could open more windows
> >         // or close some, could set appClosing TRUE from
> >         // program code
> >     }
> >
> >     App_Cleanup(); // close windows (???), shutdown
> >
> >     return 0;
> > }
> >
> > I have one main window (the usual __hMainWnd) and other windows open.  The user can
close
> > or exit from any of them.
> >
> > The problem is that only the main window is willing to close properly.  Even winio_closeall() does not get rid of the others.
> >
> > I've tried several variations of wmhandler_set for WM_CLOSE, winio_onclose, etc.  I've used message handlers galore.  It seems overly difficult to set things up so that the WINIO windows all close properly when the user selects "Exit" from the file menu.
> >
> > Given the application structure shown, could someone please demonstrate the "approved" method for shutting down all WINIO windows, and offer an explanation of why one of
them
> > would "hang" at shutdown.
> >
> > (I do have a WM_TIMER proc running on the main window and that could contribute to my
> > problem.)
> >
> > Thanks,
> >
> > Mark
>
>
>


July 23, 2001
Hmm.  Could be.  One thing was to call winio_doexit() explicitly from my code, after tweaking it to call a cleanup procedure of my own.  I have a second window called scan_params_window which WINIO was failing to close at shutdown.  On this window I call DestroyWindow from the cleanup proc.

One other thing, maybe the most important:  WINIO by default does not make new windows children of __hMainWnd.  It only does that if you make the child a "popup" style window (yuk).  This design decision seemed to cause much of the shutdown problem.  I modified new_window to make all new windows child windows of __hMainWnd.  That way when __hMainWnd closes, so do they.

Mark



void winio_doexit(HWND hwnd, int nID)
{
    // Mark's additions
    App_Cleanup();
    // originally just this:
    DestroyWindow(hMaster);
}


void App_Cleanup()
{
   static didCleaning = FALSE;

   if (didCleaning) return;
   // else:
   didCleaning = TRUE;
   appClosing = TRUE;
   Connection_Close();
   KillTimer(__hMainWnd,1);
   CircBuf_Destroy(in);
   CircBuf_Destroy(out);
   // WINIO was failing to close this guy
   DestroyWindow(scan_params_window);
   return;
}



/* ---------------------------------------------------------------  */
/* This function is called by winio_window(). It creates the new    */
/* window, and attaches the wmhandler table pointer and the         */
/* pointed to structure.                                            */
/* ---------------------------------------------------------------  */
HWND new_window(LPCREATEPARAMS cp, LPSTR strTitle, WORD wFlags)
    {
    HWND hwnd;
    WINIO_HWND whWnd = (WINIO_HWND) (cp->lpData);

    if (wFlags & WW_HASMENU)
        if (((whWnd->hFileMenu = CreateMenu()) == NULL) ||
            ((whWnd->hMainMenu = CreateMenu()) == NULL) ||
            (!hMaster && ((whWnd->hHelpMenu = CreateMenu()) == NULL)) ||
            (! AppendMenu(whWnd->hFileMenu, MF_STRING | MF_ENABLED,
                ID_SAVE, "&Save Buffer...")) ||
            (! AppendMenu(whWnd->hFileMenu,
                MF_SEPARATOR, NULL, NULL)) ||
            (! AppendMenu(whWnd->hFileMenu,
                MF_STRING | MF_ENABLED,
                ID_EXIT, "E&xit")) ||
            (!hMaster && (! AppendMenu(whWnd->hHelpMenu,
                MF_STRING | MF_ENABLED,
                ID_ABOUT, "&About..."))) ||
            (! AppendMenu(whWnd->hMainMenu,
                MF_STRING | MF_ENABLED | MF_POPUP,
                whWnd->hFileMenu, "&File")) ||
            (!hMaster && (! AppendMenu(whWnd->hMainMenu,
                MF_STRING | MF_ENABLED | MF_POPUP,
                whWnd->hHelpMenu, "&Help"))))
            return FALSE;

/*
    MJE Note
    The original WINIO source made a weird decision about whether
    to create the new window as a child window, we override that
    and make all windows child windows.
*/
    hwnd = CreateWindow((LPSTR) winio_wclass, (LPSTR) strTitle,
        winio_wstyle,
        grectCurr.left, grectCurr.top, grectCurr.right, grectCurr.bottom,
        (wFlags & WW_STAYSONTOP) ? hMaster : NULL,
        whWnd->hMainMenu, __hInst, (LPSTR) cp);
/*
    hwnd = CreateWindow((LPSTR) winio_wclass, (LPSTR) strTitle,
        winio_wstyle,
        grectCurr.left, grectCurr.top, grectCurr.right, grectCurr.bottom,
        hMaster,
        whWnd->hMainMenu, __hInst, (LPSTR) cp);
*/
    if (! hwnd)
        return NULL;

    if (!hMaster) winio_setmenufunc(hwnd, ID_ABOUT, winio_doabout);
    winio_setmenufunc(hwnd, ID_SAVE, winio_dosave);
    winio_setmenufunc(hwnd, ID_EXIT, winio_doexit);

    set_font(hwnd, whWnd);

    if (! gcxDefFont)
        {
        gcxDefFont = whWnd->cxChar;
        gcyDefFont = whWnd->cyChar;
        }

    winio_clear(hwnd);

    ShowWindow(hwnd, (hMaster) ? SW_SHOWNORMAL : __nCmdShow);
    UpdateWindow(hwnd);

    if (! hMaster)
        {
        winio_wstyle |= WS_POPUP;
        hMaster = hwnd;
        }
    else
    if (! (wFlags & WW_EXITALLOWED))
        EnableMenuItem(whWnd->hFileMenu, ID_EXIT, MF_DISABLED | MF_GRAYED);

    return hwnd;
    }


February 23, 2006
In article <1103_995505698@evans>, Mark Evans says...
>
>I'm happy to report that I have solved the problems with WINIO.

A largely unrelated response. I made a port of Andrew Schulman's WINIO for Win32, which worked very successfully for years, and enabled me to write utilities which could function both in a Windows and a Linux environment (with a certain amount of conditional compilation!). I moved away from it by writing an equivalent which used a list box for the display (simpler, and gave cut and paste etc facilities).

For my part I am quite happy to make the Win32 WINIO public if Andrew had no objection. I have a feeling that there was a Win32 port available, but it didn't work! It was all a long time ago now.

Regards
Chris Johnson
chrisj_dmars@edimatrix.co.uk