Home All Groups Group Topic Archive Search About

Locking Desktop and Threading Issue

Author
1 May 2007 4:35 PM
Jenbo
Hi, I have an application that displays forms on the users desktop,
what I am doing with it is having a SystemEvents
SessionSwitchEventHandler to capture the lock of the desktop, I would
like to kill the forms when this event is captured, that piece is
fine, but I would like to sleep the app until the
SessionSwitchReason.SessionUnlock happens then I can wake it again and
go the correct part of the code? Can I wake a sleeping thread, or
should I not sleep the thread at all, is there another way to get the
thread to sleep or hibernate and then wake up?

Thanks
Eamonn

Author
1 May 2007 5:27 PM
Jigar Mehta
Hello Jenbo,

I think you will be getting events whenever lock and unlock (of desktop)
happens. Do you want whole application to go to sleep (idle) at that time or
just one thread? If you wish that all threads go to sleep, you should have
one flag, being set whenever lock event is received, and being reset
whenever you get unlock. Other threads should check on that flags. there is
not any need to sleep really as you are getting events.

Regards,
Jigar Mehta

Show quote
"Jenbo" <eamonnjenni***@yahoo.co.uk> wrote in message
news:1178037344.143350.257590@y80g2000hsf.googlegroups.com...
> Hi, I have an application that displays forms on the users desktop,
> what I am doing with it is having a SystemEvents
> SessionSwitchEventHandler to capture the lock of the desktop, I would
> like to kill the forms when this event is captured, that piece is
> fine, but I would like to sleep the app until the
> SessionSwitchReason.SessionUnlock happens then I can wake it again and
> go the correct part of the code? Can I wake a sleeping thread, or
> should I not sleep the thread at all, is there another way to get the
> thread to sleep or hibernate and then wake up?
>
> Thanks
> Eamonn
>
Author
1 May 2007 5:41 PM
Peter Duniho
On Tue, 01 May 2007 09:35:44 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
wrote:

> Hi, I have an application that displays forms on the users desktop,
> what I am doing with it is having a SystemEvents
> SessionSwitchEventHandler to capture the lock of the desktop, I would
> like to kill the forms when this event is captured, that piece is
> fine, but I would like to sleep the app until the
> SessionSwitchReason.SessionUnlock happens then I can wake it again and
> go the correct part of the code? Can I wake a sleeping thread, or
> should I not sleep the thread at all, is there another way to get the
> thread to sleep or hibernate and then wake up?

It's not clear to me that there's really any need to do any of the things 
you want to do.  What are your forms doing that you can't just leave them 
open when the desktop is locked?  Windows will take care of hiding them 
from the user and preventing user input, and when the desktop is unlocked 
then they will still be there, ready to go.  Windows is also smart enough 
to not dedicate any attention to the user interface of the application 
while it's essentially inactivated by the desktop being locked (not that 
the UI component of an application is generally a significant load on the 
computer in the first place).

That said, it is possible to explicitly get a thread to simply stop doing 
anything.  Under Windows, a thread cannot "sleep" or "hibernate" per se 
(not in the sense that the computer can do those things), but you can 
create a waitable event and call the WaitOne() method on that.  The thread 
that calls that method will stop and wait at that call until some other 
thread sets the event, releasing the thread for further execution.

If you use a ManualResetEvent, and you insert a call to the event's 
WaitOne() method at some appropriate spot (generally a point in some 
code's processing loop that is executed often enough that latency for any 
pausing of the thread will be low, but not so often that calling WaitOne() 
causes a significant performance problem), then when you want the thread 
to pause you reset the event and when you want the thread to continue to 
set the event.

Of course, you still need at least one thread around to process the 
SessionSwitchEvent and manage any other threads that are blocked.  But I 
suppose if you have a thread that is doing something particularly i/o or 
CPU intensive and you want it to stop taking system resources when the 
desktop is locked, you could build in this sort of pausing mechanism 
without affecting the main GUI thread.

If the above doesn't help you, perhaps you could be more explicit about 
why it is you believe you need to "put your application to sleep" when the 
desktop is locked.  This isn't something that normally needs to be done, 
so you should probably be more clear about what abnormal situation exists 
in your scenario that justifies or demands that sort of behavior.

Pete
Author
1 May 2007 7:27 PM
Jenbo
Thanks for the advice, basically my forms cover the full desktop, they
are survey forms that the user takes an action against, HR related
stuff. I can get the forms to cover the full desktop in normal
processing, I have a class that does this ok, but if for example the
user locks the desktop and the application creates a form when the
user unlocks the desktop the form does not show on the full desktop
and the windows taskbar is shown, I realise this is probably normal
behaviour for windows, this is why I wanted to sleep the application,
so it can no process the form and then when it wakes up again the
application can create the normal form covering all the windows
desktop. So if I sleep the thread I can then wake it and process as
normal when the session event is unlock. So maybe I need to let it
process as normal and go back to my windows handler for the covering
of the desktop and check that piece,

Thanks
Eamonn

Show quote
On 1 May, 18:41, "Peter Duniho" <NpOeStPe***@nnowslpianmk.com> wrote:
> On Tue, 01 May 2007 09:35:44 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
> wrote:
>
> > Hi, I have an application that displays forms on the users desktop,
> > what I am doing with it is having a SystemEvents
> > SessionSwitchEventHandler to capture the lock of the desktop, I would
> > like to kill the forms when this event is captured, that piece is
> > fine, but I would like to sleep the app until the
> > SessionSwitchReason.SessionUnlock happens then I can wake it again and
> > go the correct part of the code? Can I wake a sleeping thread, or
> > should I not sleep the thread at all, is there another way to get the
> > thread to sleep or hibernate and then wake u
>
> It's not clear to me that there's really any need to do any of the things 
> you want to do.  What are your forms doing that you can't just leave them 
> open when the desktop is locked?  Windows will take care of hiding them 
>  from the user and preventing user input, and when the desktop is unlocked 
> then they will still be there, ready to go.  Windows is also smart enough 
> to not dedicate any attention to the user interface of the application 
> while it's essentially inactivated by the desktop being locked (not that 
> the UI component of an application is generally a significant load on the 
> computer in the first place).
>
> That said, it is possible to explicitly get a thread to simply stop doing 
> anything.  Under Windows, a thread cannot "sleep" or "hibernate" per se 
> (not in the sense that the computer can do those things), but you can 
> create a waitable event and call the WaitOne() method on that.  The thread 
> that calls that method will stop and wait at that call until some other 
> thread sets the event, releasing the thread for further execution.
>
> If you use a ManualResetEvent, and you insert a call to the event's 
> WaitOne() method at some appropriate spot (generally a point in some 
> code's processing loop that is executed often enough that latency for any 
> pausing of the thread will be low, but not so often that calling WaitOne() 
> causes a significant performance problem), then when you want the thread 
> to pause you reset the event and when you want the thread to continue to 
> set the event.
>
> Of course, you still need at least one thread around to process the 
> SessionSwitchEvent and manage any other threads that are blocked.  But I 
> suppose if you have a thread that is doing something particularly i/o or 
> CPU intensive and you want it to stop taking system resources when the 
> desktop is locked, you could build in this sort of pausing mechanism 
> without affecting the main GUI thread.
>
> If the above doesn't help you, perhaps you could be more explicit about 
> why it is you believe you need to "put your application to sleep" when the 
> desktop is locked.  This isn't something that normally needs to be done, 
> so you should probably be more clear about what abnormal situation exists 
> in your scenario that justifies or demands that sort of behavior.
>
> Pete
Author
1 May 2007 7:36 PM
Peter Duniho
On Tue, 01 May 2007 12:27:09 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
wrote:

> [...] So maybe I need to let it
> process as normal and go back to my windows handler for the covering
> of the desktop and check that piece

I agree, that's likely to be a more fruitful approach.  Though, it may 
simply be that there's a better way to maximize your form.

Note that the real issue you're having is that your form changes size when 
the desktop is locked.  You don't really want to suspend processing per 
se.  You just think that doing so would have the side-effect of preventing 
the form from changing size.

It's been years since I did anything with full-screen desktop applications 
and I haven't played around with the various methods to accomplish that 
recently.  So I probably can't offer much direct advice.  However, perhaps 
if you explained the technique you're using to maximize your form on the 
desktop and what exactly happens to it after the desktop is locked and 
then unlocked, you might get some good advice from other people in this 
newsgroup about how to do that correctly.

If you do that, I would suggest starting a new thread, since the title of 
this thread has very little to do with what you're actually asking about.  
You'll probably get better response by doing so, and the thread will be 
easier to look up later if someone else runs into the same issue.

Pete
Author
2 May 2007 10:36 AM
Jenbo
Show quote
On May 1, 8:36 pm, "Peter Duniho" <NpOeStPe***@nnowslpianmk.com>
wrote:
> On Tue, 01 May 2007 12:27:09 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
> wrote:
>
> > [...] So maybe I need to let it
> > process as normal and go back to my windows handler for the covering
> > of the desktop and check that piece
>
> I agree, that's likely to be a more fruitful approach.  Though, it may 
> simply be that there's a better way to maximize your form.
>
> Note that the real issue you're having is that your form changes size when 
> the desktop is locked.  You don't really want to suspend processing per 
> se.  You just think that doing so would have the side-effect of preventing 
> the form from changing size.
>
> It's been years since I did anything with full-screen desktop applications 
> and I haven't played around with the various methods to accomplish that 
> recently.  So I probably can't offer much direct advice.  However, perhaps 
> if you explained the technique you're using to maximize your form on the 
> desktop and what exactly happens to it after the desktop is locked and 
> then unlocked, you might get some good advice from other people in this 
> newsgroup about how to do that correctly.
>
> If you do that, I would suggest starting a new thread, since the title of 
> this thread has very little to do with what you're actually asking about. 
> You'll probably get better response by doing so, and the thread will be 
> easier to look up later if someone else runs into the same issue.
>
> Pete

Thanks for the ideas. Although I am not sure why the last paragraph
was necessary as I would say that the title of the thread describes
pretty well what I wanted to do at first and where I was going with
this then. Strange to get such a pedantic end of message.
Author
2 May 2007 4:41 PM
Peter Duniho
On Wed, 02 May 2007 03:36:34 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
wrote:

> Thanks for the ideas. Although I am not sure why the last paragraph
> was necessary as I would say that the title of the thread describes
> pretty well what I wanted to do at first and where I was going with
> this then. Strange to get such a pedantic end of message.

I'm sorry you found it pedantic, and honestly I don't see where you get 
that.  My intent was to offer you advice as to how you could post a 
question that is more likely to get the results you want.

Personally, I think you could've done just fine keeping your thoughts on 
the matter to yourself.  I don't see the point in bringing it up, but 
since you did...

Frankly, I left out a whole paragraph providing advice about how your 
original post really wasn't the right way to ask the question.  Further 
more, as I have pointed out and as it *seemed* that you had agreed with, 
the correct solution here isn't actually to use any sort of threading API 
to deal with the problem.

Since threading isn't relevant to the question at all, having a subject 
that mentions threading is a problem if you are looking for for help on 
the question.  It may mislead people who might be able to help you into 
thinking that they don't have anything to offer (if they are unfamiliar 
with threading issues, for example).  Additionally, since restoring your 
form to full-screen after unlocking the desktop *is* the goal, the subject 
of the thread ought to mention that.

All that said, you are obviously free to post your questions as you like.  
I appreciate you letting me know that you don't find my input helpful; 
saves me the trouble of putting any more time or effort into more of your 
questions.

Thanks,
Pete
Author
4 May 2007 8:23 AM
Jenbo
Show quote
On May 2, 5:41 pm, "Peter Duniho" <NpOeStPe***@nnowslpianmk.com>
wrote:
> On Wed, 02 May 2007 03:36:34 -0700, Jenbo <eamonnjenni***@yahoo.co.uk> 
> wrote:
>
> > Thanks for the ideas. Although I am not sure why the last paragraph
> > was necessary as I would say that the title of the thread describes
> > pretty well what I wanted to do at first and where I was going with
> > this then. Strange to get such a pedantic end of message.
>
> I'm sorry you found it pedantic, and honestly I don't see where you get 
> that.  My intent was to offer you advice as to how you could post a 
> question that is more likely to get the results you want.
>
> Personally, I think you could've done just fine keeping your thoughts on 
> the matter to yourself.  I don't see the point in bringing it up, but 
> since you did...
>
> Frankly, I left out a whole paragraph providing advice about how your 
> original post really wasn't the right way to ask the question.  Further 
> more, as I have pointed out and as it *seemed* that you had agreed with, 
> the correct solution here isn't actually to use any sort of threading API 
> to deal with the problem.
>
> Since threading isn't relevant to the question at all, having a subject 
> that mentions threading is a problem if you are looking for for help on 
> the question.  It may mislead people who might be able to help you into 
> thinking that they don't have anything to offer (if they are unfamiliar 
> with threading issues, for example).  Additionally, since restoring your 
> form to full-screen after unlocking the desktop *is* the goal, the subject 
> of the thread ought to mention that.
>
> All that said, you are obviously free to post your questions as you like. 
> I appreciate you letting me know that you don't find my input helpful; 
> saves me the trouble of putting any more time or effort into more of your 
> questions.
>
> Thanks,
> Pete

As a matter of fact, what I wanted to do was threading,

>Since threading isn't relevant to the question at all, having a subject
> that mentions threading is a problem if you are looking for for help on
> the question

It was totally relevant to the question but obviously you read my mind
and decided otherwise. Thanks again.

AddThis Social Bookmark Button