On Thu, 20 Nov 2003, Patrick LeBoutillier wrote:

> suggestions

I had a long think about this when I couldn't get it to work and came to
roughly the same conclusions as you.  Here's what I came up with, just
incase you're still looking for feedback.

 1) The simpliest implementation is a MainLoop object that has a mainloop
    method that is called from perl and does nothing but waiting on a
    queue.  Waiting could probably be achieved by using wait and notifiy
    and every time MainLoop's addThingy method is called it adds the
    passed thingy to the end of the queue and notifies the object that
    the mainloop method is waiting on.  The thingy you're adding to the
    queue could simply hold an Object, a Method, and a array of
    arguemtents which could then be invoked by mainloop when it wakes
    up by calling thingy.getMethod().invoke(thingy.getObject(),
                                            thingy.getArgs())

 2) It'd be nice to write things like ActionListenerProxy that you
    construct by passing in the mainloop and the object you want the event
    proxied to.

    For example, ActionListenerProxy would look something like this
    (warning totally untried code that I wrote directly in my mail
     client and hence am lost without syntax highlighting):

    package ActionListenerProxy
    {
       Mainloop mainloop;
       ActionListener actionListener

       public ActionListenerProxy(Mainloop mainloop,
                                  ActionListener actionListener)
       {
          this.mainloop       = mainloop;
          this.actionListener = actionListener;
       }

       void actionPerformed(ActionEvent e)
       {
          Class  actionEventClass = e.getClass();
          Class  argTypes[]       = { actionEventClass };
          Object args[]           = { e };

          // get the "actionPerformed" method for our class
          Method actionPerformedMethod =
              actionListener.getClass()
                            .getMethod("actionPerformed",argTypes);

          // schedule a thingy to be called by the mainloop
          mainloop.addThingy(
             new Thingy(actionListener,
                        actionPerformedMethod,
                        args)
          );
       }
    }

Mark.

-- 
#!/usr/bin/perl -T
use strict;
use warnings;
print q{Mark Fowler, [EMAIL PROTECTED], http://twoshortplanks.com/};

Reply via email to