Simple way of communicating with a Qt widget from another thread

I’m writing a tutorial to implement a small Logo interpreter, and it
would
be nice to use QtRuby as an output canvas for the turtle graphics bit. I
have a simple canvas class:

class Canvas < Qt::Widget
def initialize
super
@lines = []
end

def draw_line(x1, y1, x2, y2)
@lines << [x1, y1, x2, y2]
end

def paintEvent(event)
painter = Qt::Painter.new(self)
painter.pen = Qt::Pen.new(@color)
@lines.each do |x1, y1, x2, y2|
painter.drawLine x1, y1, x2, y2
end
painter.end
end
end

which I intend passing to the turtle to use via

def forward n
theta = direction * PI / 180
new_x = @x + n * cos(theta)
new_y = @y + n * sin(theta)

if @drawing
  canvas.draw_line x, y, new_x, new_y
end

@x = new_x
@y = new_y

end

I’m trying to keep the code as straightforward as possible, and focused
on
the interpreter rather than on the details of QtRuby. The problem is
that
Qt insists on being the main loop, and of course an interpreter needs to
run in a loop over the input code too.

I’m trying to think of a nice way to write the interpreter as
independently
of the Qt event loop as possible and send line drawing events to it by
simply calling canvas.draw_line, without having to change the
interpreter
architecture in any way, or have my tutorial bogged down by the details
of
threading and events.

One idea, e.g. would be to have the canvas object in the turtle be a
message queue, that the Qt canvas polled via a timer, but if someone can
think of something even simpler I’d love to hear it.

martin

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs