I obviously don't know what I'm doing, and I'm doing something horribly wrong here, because what I want to do won't work.
I'm trying to set up a server class, using a Listen function as the constructor, and this function calls a Wait function that loops (until boolean done is set to 1) in a new thread.
When I want to shut down the server, obviously I need to do both of these:
[*] set done←1, which will stop the endless loop, and the thread will shut itself down naturally (I'd rather not ⎕TKILL the thread if I can help it)
[*] erase the class instance
I tried coding to set done←1 in the destructor, but on saying )erase xyz nothing happens because the destructor doesn't get called even though xyz is erased, because the instance carries on operating. My other thought is to get the instance to erase itself after the thread has shut down, but I can't figure out how to do that.
Ideally, I'd like to use )erase or ⎕EX to shut the server down and erase the instance. Has anyone got any thoughts on this?
How can I destroy my instance?
-
- Posts: 66
- Joined: Mon Apr 04, 2011 3:16 pm
Re: How can I destroy my instance?
Jane,
:class Foo
{del}Foo
:implements constructor
:access public
{comment} kick off the new thread here...
{del
{del}NoFoo
:implements destructor
:access private
MyThread.Done<-1
{del}
:endclass
MyFoo<-[]NEW #.Foo
You can kick off the thread in MyFoo's constructor.
When you ")erase MyFoo" the destructor method Foo will be called and you can set Done to 1 in the object running in a thread to terminate the thread. Not sure why your destructor is not getting called -- worked for me here...
:class Foo
{del}Foo
:implements constructor
:access public
{comment} kick off the new thread here...
{del
{del}NoFoo
:implements destructor
:access private
MyThread.Done<-1
{del}
:endclass
MyFoo<-[]NEW #.Foo
You can kick off the thread in MyFoo's constructor.
When you ")erase MyFoo" the destructor method Foo will be called and you can set Done to 1 in the object running in a thread to terminate the thread. Not sure why your destructor is not getting called -- worked for me here...
Re: How can I destroy my instance?
Erik
I think it's because the function running in the new thread is from the class, and that needs to finish before the destructor will start.
According to the documentation an instance only disappears when the last reference to it disappears. So my ")erase xyz" erases the visible reference to the class, but an invisible reference is left, because the function from the class is still running. Only when that function terminates does the instance disappear and the destructor is called.
I think it's because the function running in the new thread is from the class, and that needs to finish before the destructor will start.
According to the documentation an instance only disappears when the last reference to it disappears. So my ")erase xyz" erases the visible reference to the class, but an invisible reference is left, because the function from the class is still running. Only when that function terminates does the instance disappear and the destructor is called.
Jane
-
- Posts: 66
- Joined: Mon Apr 04, 2011 3:16 pm
Re: How can I destroy my instance?
Not sure why they consider the thread as holding a separate reference to the object -- this might be a bug. I guess you can define a property to shut down the thread and sit in a wait loop till it terminates. Then you can do your )erase.