Re: [OT] Finite vs Infinite State Machines?
Re: [OT] Finite vs Infinite State Machines?
- Subject: Re: [OT] Finite vs Infinite State Machines?
- From: Dave <email@hidden>
- Date: Mon, 02 Jul 2012 19:50:37 +0100
On 15 Jun 2012, at 00:54, Graham Cox wrote:
On 15/06/2012, at 3:56 AM, Dave wrote:
On 14 Jun 2012, at 05:12, Graham Cox wrote:
On 14/06/2012, at 8:03 AM, Dave wrote:
In assembler this would be implemented is using an "Exchange
Instruction" to alter the PC on the stack and cause it to return
to the correct place once the ASync Task (usually an interrupt)
had finished.
Ah, those were the days - push a calculated address on the stack
and do a 'RET' to cause a jump to that address... thankfully such
tricks are wholly unnecessary these days. In fact a simple
switch...case statement does the same job in most cases.
I'm not sure of the answer to your question though, seems to me
you could simply queue each task then the next executes as soon
as the one ahead of it finishes.
The point is you can't queue B until the data from A has been
obtained and that might take a long while. There are two ways to
deal with it, either have a call back from the lower level that
returns the data (in which case you have to specify an address/
selector to go to when the data has been obtained sucessfully), OR
you can invert the control and make the interface look as it is
demand based, even though the data is being obtained as and when
it is ready.
I can't really see the problem here. You can still queue the tasks,
even if the queued task doesn't have the data available when it's
queued - the data will be available by the time it comes to run, so
it can just ask for it then. It's really simple to create demand-
based data providers in Cocoa using informal or formal protocols,
delegation, or passing a predefined selector/target as you suggest.
Or using NSInvocation.
I can't see how queuing the Request would help or work in this case.
The point is that I don't know which request will be next because
it's dependent on the data returned by the previous request.
e.g.
myResponse = doTaskA;
if (myResponse.param == 1)
myResponse = doTaskB;
else
myResponse = doTaskC;
There is no point in queuing TaskB *and* TaskC since you don't know
which one you need to run until you get the response back from TaskA.
There are many solutions, there's probably no One True Way™ but
certainly you have the tools at your disposal - there are plenty of
solid reliable solutions that require no particular tricks, and
certainly nothing skanky of the sort you were reminiscing about!
The way I am doing it is not skanky in fact it works really well. The
code was already written using selector/target delgates and was a 2000
+ Lines of Code Class, doing it using an Infinite State Machines type
thing made it less than half that and the code is MUCH easier to
follow and MUCH easier to extend in the future.
All the Best
Dave
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden