Re: Multitasking 2 Problem

new topic     » goto parent     » topic index » view thread      » older message » newer message

Al Getz wrote:
> My second question is, why do the tasks have to be created over
> again after they 'end' normally?  Why cant the task id's be
> persistent until the user removes (or kills or whatever) the task?
> The reason for asking this is mainly because a "task" will be
> a routine (with a routine id) that will remain part of the program
> until the process ends, so it would make sense that if it was
> declared as a task that it would normally be used as a task until
> the program ends.  The only thing that needs to change is if it
> is active or not, ie if it should be called or not which i guess
> would be done with task_schedule().  If the task ends there's really
> no reason to have to change the id is there?  Even with 50 tasks in
> a program that would only mean 50 id's issued and that would be that.
> If a task 'ended' it would be taken off the active list.  This would
> also mean there could never be confusion about a task id belonging
> to one task or another because an id would last till programs end,
> just like a routine_id.

I'm not sure if you understand that a task is not a routine,
and a routine is not a task. A program has a fixed number
of routines, but you can dynamically create 1000 
or 1 million tasks that all run the same (say) quick sort routine
at the same time, but using different private data, a different 
call stack, and a different "next statement to execute".
Each of those (potentially) millions of tasks needs its own task id.
That task id should not be recycled immediately because another
task might be monitoring the status of that task, and might
not check the status until long after the first task is dead and gone.
If another task were assigned the same id, it could be confusing.

If you look at Language War, it has maybe a dozen "fixed" tasks that
are created near the beginning of the game, and never die.
Most of them do something like:
global procedure task_life()
-- independent task: update "life support" energy
    while TRUE do
        if shuttle then
            p_energy(-3)
        else
            p_energy(-13)
        end if
        task_yield()
    end while
end procedure


The infinite while loop prevents this task from ever 
reaching the end and terminating. It can only be terminated
if another task kills it, or the whole program ends.
Only one task id is needed.

There are other cases in LW where an infinite-loop task can
be suspended and later rescheduled by other tasks, as need be, 
but it never runs off the end or returns. Maybe that's
what you are looking for.

Language War also has tasks that are created, do their thing,
and then die, so the task id numbers do creep up indefinitely
as the game progresses. e.g. each phasor that's drawn is 
a separate task that uses up a task id number. If you play a game of
Language War for 1000 trillion years, the id numbers might roll over.
Actually, a few days ago, as a test, I changed the 1e14 roll over
point to something like 20 or 30, and Language War ran fine. It wrapped
numerous times, but I don't have tasks that check the status of other
tasks. Most tasks are very independent of each other, or
else they check global variables to see what has happened so far.

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu