Creating and handling a non_GUI event


#1

I need to change the value of a Wx::TextCtrl when a message is received
in a separate thread from the GUI. I think I should be creating a class
derived from Wx::Event (not Wx::CommandEvent) for this. But I haven’t
been able to get it to work.

Here’s my event class:

class TextMsgEvent < Wx::Event
EVT_TEXT_MSG = Wx::EvtHandler.register_class(self, nil,
‘evt_text_msg’, 1)

def initialize(text)
@text = text
super(0, EVT_TEXT_MSG)
end
end

My Frame class includes this:

class myFrame < Wx::Frame

def initialize

@text = TextCtrl.new(self, ID_ANY, $status, Point.new(20, 20),
Size.new(250, 150), SUNKEN_BORDER|TE_READONLY|TE_MULTILINE)
evt_text_msg(@text.get_id) {|event| on_text(event) }

end

end

When I receive the message (which contains the text) in In my non-GUI
thread I call:

$myFrame.process_event(TextMsgEvent.new(text))

But I don’t seem to be even getting into TextMsgEvent.initialize.

(When I was deriving from Wx::CommandEvent instead of Wx::Event, I was
successfully creating a TextMsgEvent, but the process_event returned
false.)

Any suggestions? Am I even going about this in the right way?

Thanks,
Eric R.


#2

Hey Eric,

Do you have a GitHub repository with the actual code in it, or could you
paste the most minimal code, that reproduces the error, so that we can
properly diagnose the issue?

Thanks,

Mario

On Wed, Apr 10, 2013 at 1:43 PM, Eric R. removed_email_address@domain.invalid
wrote:

def initialize
thread I call:

Thanks,
Eric R.


Posted via http://www.ruby-forum.com/.


wxruby-users mailing list
removed_email_address@domain.invalid
http://rubyforge.org/mailman/listinfo/wxruby-users


Mario S.
Fleet Captain
CO - Geo 99
CO - USS T’hy’la
XO - Diplomatic Corps - Second Life
http://www.iftcommand.com/chapters/thyla/
http://www.trekfederation.com


#3

Okay, here is a minimal test program (attached).

I want my NonGuiThread to be able to change the value of the TextCtrl.
Is add_pending_event the right way to do this?

(It seems that TextMsgEvent should be an Event, not a CommandEvent,
since it’s not a GUI event, but with Event the code doesn’t work at
all.)

Thanks,
Eric R.


#4

Hello Eric,

Sorry for the late reply, I was busy with Windows issues, and couldn’t
test
with Ruby 2.0, as wxRuby needs to be compiled with Ruby 2.0.

In any case, after testing, and throwing in a require ‘thread’ and
Thread.abort_on_exception = true, I found that when you sub-class a
Wx::Event, and attempt create a new instance of the sub-class, you will
end
up with an internal error, saying that no allocator has been defined for
Wx::Event, which in all cases, is true, cause in C++ wxWidgets,
Wx::Event,
isn’t a True Instantiate class. In C++, the WxEvent Class is considered
an
Abstract Base Class, or to put it into Ruby Terms, consider WxEvent a
Module.

It defines the base methods and instance variables / structure of the
class
for any sub-class of WxEvent, without actually having an allocator
associated with the base class itself. So in order to actually get a
Class
that is usable in Ruby, you need to sub-class a pre-existing C++ Class,
such as Wx::CommandEvent (WxCommandEvent class), in order to have it
work
in Ruby.

I hope that this helps with your future programming.

Mario

On Thu, Apr 11, 2013 at 8:52 AM, Eric R. removed_email_address@domain.invalid
wrote:

Eric R.
http://rubyforge.org/mailman/listinfo/wxruby-users


Mario S.
Fleet Captain
CO - Geo 99
CO - USS T’hy’la
XO - Diplomatic Corps - Second Life
http://www.iftcommand.com/chapters/thyla/
http://www.trekfederation.com