Login
`
Templates, Tools and Utilities
|
||
Icetips Article
Back to article list
Search Articles
Add Comment
Printer friendly
Direct link
OOP: Opening threads from a class 2004-03-25 -- Jim Kane Newsgroups: comp.lang.clarion
> Now I would really like to do a window that is always on top and shows
> me the updated queueentries as they come in. As far as I can see I
> need to start this window in it's on thread, but I don't know how and
> where do do it in my class definition.
>
> Can you help me?
In any class method right in your code open a dummy window so there is an
accept loop and in EVENT:openwindow, start() the window that shows the log.
If the data to show is in a queue, then wrap the queue or a ref to the queue
in another class and pass the address of the class to the started thread.
Here is a quick example. In some cases you may want to use a 2nd local
queue on the viewer thread and copy data to it under critical section
protection from the global queue that is shared between two threads. If a
personal use debug proc I probably would not bother but for something going
to a customer I would:
mymethod procedure()
dummywindow window....
end
code
if SELF.Viewerthread then message('viewer running already dummy.');return.
SELF.ClassToWrapQ&=New ClassToWrapQtype
SELF.ClassToWrapQ.init(SELF.Q,SELF.ViewerThread, SELF.CritSecCl)
!these 3 lines in the classtowrapq init method:
! SELF.ClassToWrapQ.Q&= parameterQ !Queue with my data to show
! SELF.ClassToWrapQ.ViewerThread&=parameterViewerThread
! SELF.ClassToWrapQ.CSClass&=parameterCritSecClass
open(dummywindow)
0{prop:hide}=1
accept
case event()
of event:openwindow
SELF.ViewerThread=start(viewerproc,,address(SELF.ClassToWrapQ))
post(event:closewindow)
end
end !accept
close(dummywindow)
kill procedure
dummywindow window()
end
code
!try 5000 times to close down the viewer thread
if SELF.ViewerThread then
loop 5000 times
open(dummywindow)
0{prop:hide}=1
accept
case event()
of event:openwindow
Post(event:closewindow,,SELF.ViewerThread,1)
post(event:closewindow)
end
end
close(dummywindow)
if ~SELF.ViewerThread then break.
!self.viewer thread is cleared by the other thread when it closes
end !loop
end
if ~SELF.ClassToWrapQ&=NULL
SELF.ClassToWrapQ.Kill()
!let the class clean up - dispose crit sec class
dispose(SELF.ClassToWrapQ)
end
Dispose(SELF.Q)
!if the viewer thread is not dead you will now get a gpf.
Dispose(SELF.CritSecCl)
return
Jim Kane
Today is November 21, 2024, 3:48 am This article has been viewed 35399 times. Google search has resulted in 8 hits on this article since January 25, 2004.
|
|