`
Clarion 6: Keep track of all threads 2004-03-12 -- Don Wood Newsgroups: softvelocity.public.clarion6 > Is there a way to loop through all the active threads? > I need to know if a certain file is in use somewhere in my program before > it continues. I would suggest a global, non-threaded queue containing three variables. !--------------------------------------------------------------------------- INCLUDE('CWSYNCHC.INC'),ONCE ! needed for critical sections EVENT:CheckFileForUse EQUATE (760H) EVENT:CheckedFileForUse EQUATE (761H) MainThread Signed ThreadQueue Queue, pre(TQ) ThreadNumber Signed FileInUse Byte CheckedForUse Byte End ThreadCS CriticalSection !--------------------------------------------------------------------------- When the App starts, save it's THREAD() in the MainThread variable. Then, everytime you start a Proc in a new thread, you add it's Thread to the queue: !--------------------------------------------------------------------------- ThreadCS.wait() clear(ThreadQueue) TQ:ThreadNumber = Thread() add(ThreadQueue) ThreadCS.Release() !--------------------------------------------------------------------------- Also in the kill embed you'll want to remove the thread number from the queue. Now, to find out if any of the threads are using the file, loop through the queue and post an event to each queue, telling them to check and send a response. !--------------------------------------------------------------------------- ThreadCS.wait() loop i# = 1 to records(ThreadQueue) !first clear all the queue's flags TQ:FileInUse = FALSE TQ:CheckedForUse = FALSE put(ThreadQueue) ! then tell each thread to check post(EVENT:CheckFileForUse, ,TQ:ThreadNumber) end ThreadCS.Release() !--------------------------------------------------------------------------- Then in each thread check for the event in TakeEvent() and check if the file is in use !--------------------------------------------------------------------------- case EVENT() of EVENT:CheckFileForUse ThreadCS.wait() clear(ThreadQueue) TQ:ThreadNmber = thread() get(threadqueue) if ~errorcode() TQ:CheckedForUse = true ! check for file in use in this thread ! if file in use TQ:FileInUse = true else TQ:FileInUse = false end put(ThreadQueue) end post(EVENT:CheckedFileForUse,,MainThread) end ThreadCS.Release() !--------------------------------------------------------------------------- Lastly, in your Main thread you wait for the CheckedFileForUse events. !--------------------------------------------------------------------------- ThreadCS.wait() loop i# = 1 to records(threadQueue) get(ThreadQueue, i#) if TQ:CheckedForUse = FALSE ! not all threads have responded, might want to break here, ! and wait for another event end if TQ:FileInUse = TRUE ! do what ever you want when the file is in use end end ThreadCS.Release() !--------------------------------------------------------------------------- It's long and a little confusing, but It's the best way I know of to have all your threads communicating. Hope this helps, Don Wood VendPrint, Inc. Printed December 3, 2024, 11:53 am This article has been viewed/printed 35333 times. Google search has resulted in 26 hits on this article since January 25, 2004. |