Can you run each document on its own thread?

Oh, it also looks like we actually flow CodeContext through to the caller.  So 
you could do something like:

class MyFile {
        public void write(CodeContext context, string data) {
                Scope curScope = context.Scope;         // this gives you the 
module you're running in

                // handle write here keyed off of the scope object
        }
}

And replace sys.stdout with that.

-----Original Message-----
From: users-boun...@lists.ironpython.com 
[mailto:users-boun...@lists.ironpython.com] On Behalf Of Jeff Slutter
Sent: Friday, January 30, 2009 6:41 PM
To: Discussion of IronPython
Subject: Re: [IronPython] Redirecting stdout/stderr, but with context

Dino Viehland wrote:
> You can always provide your own stream which is aware of what the current 
> output window is.  It could store this in a thread static or just some 
> variable that you update whenever the active window changes.  You can set 
> that via ScriptRuntime.IO.OutputStream.  You could conceptually do the exact 
> same thing from Python just by setting sys.stdout to a file-like object which 
> knows what the current output window is.

This is what I'm doing right now and that's where I'm having my problem.
   I don't think this is a solvable problem since the output stream is
shared by all ScriptScopes, just as the output stream for
System.Console.WriteLine is the same across the process.

In a nutshell, I have this:

class Document
{
  void AppendOutput( string text )
  {
    m_buffer.Add(text);
  }
  List<string> m_buffer;
}

class ConsoleWindow: Form
{
   public void WriteOutput( string text, Document doc )
   {
      doc.AppendOutput( text );
      if( doc == m_currentDisplayingDoc )
      {
         textBox.Text += text;
      }
   }
}

class DocWriter
{
  public DocWriter( ConsoleWindow console, Document doc )
  {
    m_console = console;
    m_document = doc;
  }

  public void write(string text)
  {
    m_console.WriteOutput( text, m_document );
  }
  ConsoleWindow m_console;
  Document m_document;
}

void OnDocumentActivate(Document doc)
{
  DocWriter writer = new DocWrite(guiConsole, doc);
  object sysObj = doc.scope.GetVariable("sys");
  m_engine.Operations.SetMember(sysObj, "stdout", writer);
  m_engine.Operations.SetMember(sysObj, "stderr", writer);
}


The problem is:
If there is a script running on DocumentA, that is streaming output, and
then I switch to DocumentB while DocumentA continues to run - the output
for DocumentA starts appearing in the console window for DocumentB as if
it was for B. This is because sysout is system wide and if I change it
while DocumentA is writing, then it starts outputting to the new stream
that was set (and that was registered with DocumentB).


-Jeff
_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to