<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7653.38">
<TITLE>AW: [erlang-questions] Selective receive issue</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Hi again!<BR>
<BR>
So why not use a second loop in the processInput/2 - funcction and<BR>
return a state-change to the original loop if desired?<BR>
<BR>
loop(State) -><BR>
   receive<BR>
       activate -> <BR>
          NewState = replaceVariable(State, {active, true}),<BR>
          loop(NewState);<BR>
       deactivate -><BR>
          NewState = replaceVariable(State, {active, false}),<BR>
          loop(NewState);<BR>
       {input, Data} -><BR>
          case getValue(State, active) of<BR>
             false -><BR>
                loop(State);<BR>
             true -><BR>
               case processInput(Data) of<BR>
                   {false, Reason} -><BR>
                      exit(Reason); %% so u know when computation is corrupted<BR>
                   {true, NewState} -><BR>
               loop(NewState)<BR>
          end;<BR>
      AnyMessage -><BR>
          case getValue(State, active) of<BR>
             false -><BR>
                loop(State);<BR>
             true -><BR>
               %% now storing the msg in the loop's state:<BR>
               NewState = replaceVariable(State, {pending, AnyMessage}),<BR>
               loop(State)<BR>
          end<BR>
      after 2300 ->   <BR>
         timeOutRoutine(),<BR>
         loop()<BR>
   end.<BR>
<BR>
processInput(Data) -><BR>
   case whereis(secondLoop) of<BR>
      undefined -><BR>
         Pid = spawn(secondLoop, secondLoop, [Data, self()]),<BR>
         register(secondLoop, Pid);<BR>
      _Pid -><BR>
         void<BR>
   end,<BR>
   receive<BR>
      {processed, NewState} -><BR>
         {true, NewState}<BR>
      {false, Reason} -><BR>
         {false, Reason}<BR>
      after 2300 -><BR>
         {false, timeout_occured}<BR>
   end.<BR>
<BR>
secondLoop(Data, From) -><BR>
   receive<BR>
      Pattern1 -><BR>
         NewState = processDataAccordingToPattern(Data, Pattern1),<BR>
         From ! {processed, NewState};<BR>
      PatternN -><BR>
         NewState = processDataAccordingToPattern(Data, PatternN),<BR>
         From ! {processed, NewState}<BR>
      after 2300 -><BR>
         timeOutRoutine(),<BR>
         From ! {false, timeout_occured}<BR>
   end.<BR>
<BR>
<BR>
While the processDataAccordingToPattern-functions return the NewState for the original loop (if desired)<BR>
<BR>
In case i missunderstood the requirements of the loop-functionalities and your initial question was left unanswered<BR>
your are welcome to explain your exact specifications and the process-topology in detail.<BR>
<BR>
Best regards,<BR>
<BR>
Christoph Grasl<BR>
Embedded Software Entwickler<BR>
<BR>
KEYTRONIX<BR>
Gesellschaft für industrielle Elektronik und Informationstechnologie mbH<BR>
<BR>
Ungargasse 64-66/1/109<BR>
A-1030 WIEN<BR>
<BR>
E-Mail: c.grasl@keytronix.com<BR>
Tel.: +43 (1) 718 06 60 - 323<BR>
Mobil: +43 (664) 8556456<BR>
WWW: <A HREF="http://www.keytronix.com">http://www.keytronix.com</A><BR>
<BR>
HG Wien FN 261131t<BR>
<BR>
Confidentiality Notice:<BR>
This message may contain privileged and confidential information. If you think, for any reason, that this message may have been addressed to you in error, you must not disseminate, copy or take any action in reliance on it, and we would ask you to notify us immediately by return email.<BR>
</FONT>
</P>

</BODY>
</HTML>