<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Hi Jaromir,<br>
    <br>
    On 7/14/2022 4:49 PM, Jaromir Matas via Cuis-dev wrote:
    <blockquote
cite="mid:BYAPR03MB407296371F6CADC12784BD19EE889@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Calibri Light";
        panose-1:2 15 3 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing
        {mso-style-priority:1;
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";
        color:black;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
      <div class="WordSection1">
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Hi Juan,<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Gosh, this is amazing! I couldn't wait to
          see :)<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I ran out of mean examples :D<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    Fun, Fun, Fun!<br>
    <br>
    <blockquote
cite="mid:BYAPR03MB407296371F6CADC12784BD19EE889@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal">One observation though: Sometimes, although
          rarely and irregularly, this happens:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I run an example (in the Workspace), e.g.
          this one:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">[1/0] fork.<o:p></o:p></p>
        <p class="MsoNormal">5 seconds asDelay wait.<o:p></o:p></p>
        <p class="MsoNormal">self error: 'error'<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">and then I move the first debugger window
          and close it before the 5 second delay expires and when the
          second debugger opens I get an MNU error concerning drawing -
          I'm enclosing a snip (if I knew how to file out the debugger's
          stack contents I'd send it too). And the next time you run the
          same example it may happen again or may not... Can't figure
          out any pattern except you have to move the first debugger
          window before closing it.<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    Oh, yes. Letting the old Morphic process end by itself may mean that
    there is more than one process trying to draw the world. And if some
    higher priority process wakes up, maybe the other morphic process is
    scheduled next. Just pushed a couple of tweaks to reduce the risk as
    much as possible.<br>
    <br>
    <blockquote
cite="mid:BYAPR03MB407296371F6CADC12784BD19EE889@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal">--<o:p></o:p></p>
        <p class="MsoNormal">One stupid question: How do you make the
          image download the latest changes you made at github? I
          thought this would work: World menu -> changes ->
          install new updates but it doesn't... Now I think it's maybe
          not supposed to download from github but just locally from the
          CoreUpdates folder... Is that so?<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    Yes. The base image doesn't even include networking code. It will
    only access local files.<br>
    <br>
    <blockquote
cite="mid:BYAPR03MB407296371F6CADC12784BD19EE889@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal">What I do now (sorry if it sounds too
          stupid) is I download a new image which contains the latest
          changes in the CoreUpdates folder already...<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">The thing is I'm on Windows and don't do
          any git stuff or any command line stuff ;) Is there a way for
          users like me to update easily?<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    The alternative would be to grab the update files from github using
    the web browser. Could be even more tedious that grabbing a full zip
    file each time. The alternative is to use git, of course. I use git
    in Windows each time I save new Cuis images, as it is easier to run
    32 bit systems than in Linux or MacOS. Just open the git bash and do
    git pull. Actually, I wouldn't be surprised if the Linux subsystem
    for Windows already includes git.<br>
    <br>
    <blockquote
cite="mid:BYAPR03MB407296371F6CADC12784BD19EE889@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal">--<o:p></o:p></p>
        <p class="MsoNormal">Well, actually, what would think about
          situations like this:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">[1/0] fork.<o:p></o:p></p>
        <p class="MsoNormal">[ 10000 factorial. Processor yield ] repeat<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">would you expect, or consider reasonable to
          expect, the UI to process the 1/0 exception during the long
          computation?<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I'd tend to say no but then when I look at
          this example:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">[1/0] fork.<o:p></o:p></p>
        <p class="MsoNormal">[ 10000 factorial. 5 seconds asDelay wait ]
          repeat<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I'm not so sure... The delay blocks the UI
          and a thus a new UI is created etc. while in the former case
          yield just allows other processes of the same priority to run
          etc… which are implementation details…
          <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">And if you run the former example forked:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">[[1/0] fork.<o:p></o:p></p>
        <p class="MsoNormal">[ 10000 factorial. Processor yield ]
          repeat] fork<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">You won’t be surprised the 1/0 exception is
          executed immediately after the first yield. Which leads me
          closer to expecting the 1/0 exception appear after the first
          yield even in the former example. I believe the computation’s
          result shouldn’t depend on whether it runs in the UI or not. <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I'm curious to know your opinion.<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Many thanks,<o:p></o:p></p>
        <p class="MsoNormal">jaromir<o:p></o:p></p>
      </div>
    </blockquote>
    <br>
    Interesting examples. I think there are arguments to support both
    sides. So, far, I'm OK with firing a new UI process if the current
    one is blocked, suspended or terminated. Likely the user is trying
    to recover control using cmd+. But starting a new UI process only
    because the current one is busy, is something that would require
    making all morphic fully multithreading. I don't think the
    complexity is worth, at least unless we see a "real world" need.<br>
    <br>
    If the programmer started a long computation in the UI process by
    mistake, they can cmd + . to recover control, and then try something
    better (perhaps fork the workload). If they did it on purpose, well,
    then they actually asked for the UI to be unresponsive during that
    time.<br>
    <br>
    If we changed this, not only the Morphic framework should be
    multithreading safe. Also all application code: Application level
    code could be busy updating data, while on a separate process the
    user tries to use it or modify it in some other way. We'd be forcing
    all app developers to be "parallel processing aware", even if they
    are writing simple code. I prefer to let those, willing to do heavy
    processing -and- have a responsive UI at the same time,  find a
    suitable design.<br>
    <br>
    Hope this makes sense to you.<br>
    <br>
    Cheers!<br>
     <o:p></o:p>
    <pre class="moz-signature" cols="72">-- 
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis-smalltalk.org">www.cuis-smalltalk.org</a>
<a class="moz-txt-link-freetext" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a>
<a class="moz-txt-link-freetext" href="https://github.com/jvuletich">https://github.com/jvuletich</a>
<a class="moz-txt-link-freetext" href="https://www.linkedin.com/in/juan-vuletich-75611b3">https://www.linkedin.com/in/juan-vuletich-75611b3</a>
<a class="moz-txt-link-freetext" href="https://independent.academia.edu/JuanVuletich">https://independent.academia.edu/JuanVuletich</a>
<a class="moz-txt-link-freetext" href="https://www.researchgate.net/profile/Juan-Vuletich">https://www.researchgate.net/profile/Juan-Vuletich</a>
<a class="moz-txt-link-freetext" href="https://patents.justia.com/inventor/juan-manuel-vuletich">https://patents.justia.com/inventor/juan-manuel-vuletich</a>
<a class="moz-txt-link-freetext" href="https://twitter.com/JuanVuletich">https://twitter.com/JuanVuletich</a></pre>
  </body>
</html>