[wxruby-users] Problem with runtime error/segfault

Daniel Washburn lists at ruby-forum.com
Sun Apr 13 22:32:49 EDT 2008


Set all the alarms to something, it doesn't matter what except sometime
in the future and out of the way except for #1. Set the first alarm on,
to maybe 2 minutes from the time you run the program. Every time I run
it I get a segfault or a runtime error. What's wrong?

# Only works if turned on before it goes off on the the day that it will

$statusChoice = ["On", "Off"]
$hourChoice = ["00", "01", "02", "03", "04", "05", "06", "07", "08",
"09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23"]
$minChoice = ["00", "15", "30", "45"]
$secChoice = ["00", "15", "30", "45"]
require "Wx"
include Wx
require 'on-off.rb'
require 'Sets1.rb'

class SetsFrame < Frame
  def initialize()
    super(nil, -1, 'Settings')

    choices = ['Alarm # 1', 'Alarm # 2', 'Alarm # 3', 'Alarm # 4']

    @setsPanel = Panel.new(self)
    $whichAlarm = ComboBox.new(@setsPanel, -1, 'Alarm # 1',
DEFAULT_POSITION, DEFAULT_SIZE, choices,   CB_READONLY)
    @editButton = Button.new(@setsPanel, -1, 'Edit')
    evt_button(@editButton.get_id()) {|event|editButtonClick(event)}
    @setsPanelSizer = BoxSizer.new(VERTICAL)
    @setsPanel.set_sizer(@setsPanelSizer)
    @setsPanel.sizer.add($whichAlarm, 0, GROW|ALL, 2)
    @setsPanel.sizer.add(@editButton, 0, GROW|ALL, 2)
    show()
  end

  def editButtonClick(event)
    $whichAlarmVal = $whichAlarm.get_value()
    if $whichAlarmVal == 'Alarm # 1'
      require 'Sets1.rb'
    elsif $whichAlarmVal == 'Alarm # 2'
      require 'Sets2.rb'
    elsif $whichAlarmVal == 'Alarm # 3'
      require 'Sets3.rb'
    elsif $whichAlarmVal == 'Alarm # 4'
      require 'Sets4.rb'
    else
      # Nothings
    end

    EditFrame.new
  end
end

class EditFrame < Frame
  def initialize()
    super(nil, -1, 'Edit')

    @aPanel = Panel.new(self)
    @someText = StaticText.new(@aPanel, -1, "Edit", DEFAULT_POSITION,
DEFAULT_SIZE, ALIGN_CENTER)
    @comboStatus = ComboBox.new(@aPanel, -1, $statusDef,
DEFAULT_POSITION, DEFAULT_SIZE, $statusChoice, CB_READONLY)
    @hourText = StaticText.new(@aPanel, -1, "Hours")
    @comboHour = ComboBox.new(@aPanel, -1, $hourDef, DEFAULT_POSITION,
DEFAULT_SIZE, $hourChoice, CB_DROPDOWN)
    @minText = StaticText.new(@aPanel, -1, "Minutes")
    @comboMin = ComboBox.new(@aPanel, -1, $minDef, DEFAULT_POSITION,
DEFAULT_SIZE, $minChoice, CB_DROPDOWN)
    @secText = StaticText.new(@aPanel, -1, "Seconds")
    @comboSec = ComboBox.new(@aPanel, -1, $secDef, DEFAULT_POSITION,
DEFAULT_SIZE, $secChoice, CB_DROPDOWN)
    @textAlarm = StaticText.new(@aPanel, -1, "Alarm Text")
    @alarmText = TextCtrl.new(@aPanel, -1, $textDef, DEFAULT_POSITION,
DEFAULT_SIZE, TE_MULTILINE)
    @dayText = StaticText.new(@aPanel, -1, "Days")
    @checkSun = CheckBox.new(@aPanel, -1, "Sunday")
    @checkMon = CheckBox.new(@aPanel, -1, "Monday")
    @checkTue = CheckBox.new(@aPanel, -1, "Tuesday")
    @checkWed = CheckBox.new(@aPanel, -1, "Wednesday")
    @checkThu = CheckBox.new(@aPanel, -1, "Thursday")
    @checkFri = CheckBox.new(@aPanel, -1, "Friday")
    @checkSat = CheckBox.new(@aPanel, -1, "Saturday")
    @saveButton = Button.new(@aPanel, -1, 'Save')
    @defButton = Button.new(@aPanel, -1, 'Return to Defaults')
    evt_button(@saveButton.get_id()) {|event|saveButtonClick(event)}
    evt_button(@defButton.get_id()) {|event|defButtonClick(event)}
    @aPanelSizer = BoxSizer.new(VERTICAL)
    @aPanel.set_sizer(@aPanelSizer)
    @aPanel.sizer.add(@someText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@comboStatus, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@hourText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@comboHour, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@minText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@comboMin, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@secText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@comboSec, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@textAlarm, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@alarmText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@dayText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkSun, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkMon, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkTue, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkWed, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkThu, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkFri, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@checkSat, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@saveButton, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@defButton, 0, GROW|ALL, 2)
    @checkSun.set_value($sun)
    @checkMon.set_value($mon)
    @checkTue.set_value($tue)
    @checkWed.set_value($wed)
    @checkThu.set_value($thu)
    @checkFri.set_value($fri)
    @checkSat.set_value($sat)
    show()
  end

  def sets1
    File.open('Sets1.rb', 'w') do |f|
      f.puts "$statusDef = \"#{$comboStatusVal}\"
$hourDef = \"#{$comboHourVal}\"
$minDef = \"#{$comboMinVal}\"
$secDef = \"#{$comboSecVal}\"
$textDef = \"#{$alarmTextVal}\"
$sun = #{$checkSunVal}
$mon = #{$checkMonVal}
$tue = #{$checkTueVal}
$wed = #{$checkWedVal}
$thu = #{$checkThuVal}
$fri = #{$checkFriVal}
$sat = #{$checkSatVal}"
    end
  end

  def sets2
    File.open('Sets2.rb', 'w') do |f|
      f.puts "$statusDef = \"#{$comboStatusVal}\"
$hourDef = \"#{$comboHourVal}\"
$minDef = \"#{$comboMinVal}\"
$secDef = \"#{$comboSecVal}\"
$textDef = \"#{$alarmTextVal}\"
$sun = #{$checkSunVal}
$mon = #{$checkMonVal}
$tue = #{$checkTueVal}
$wed = #{$checkWedVal}
$thu = #{$checkThuVal}
$fri = #{$checkFriVal}
$sat = #{$checkSatVal}"
    end
  end

  def sets3
    File.open('Sets3.rb', 'w') do |f|
      f.puts "$statusDef = \"#{$comboStatusVal}\"
$hourDef = \"#{$comboHourVal}\"
$minDef = \"#{$comboMinVal}\"
$secDef = \"#{$comboSecVal}\"
$textDef = \"#{$alarmTextVal}\"
$sun = #{$checkSunVal}
$mon = #{$checkMonVal}
$tue = #{$checkTueVal}
$wed = #{$checkWedVal}
$thu = #{$checkThuVal}
$fri = #{$checkFriVal}
$sat = #{$checkSatVal}"
    end
  end

  def sets4
    File.open('Sets4.rb', 'w') do |f|
      f.puts "$statusDef = \"#{$comboStatusVal}\"
$hourDef = \"#{$comboHourVal}\"
$minDef = \"#{$comboMinVal}\"
$secDef = \"#{$comboSecVal}\"
$textDef = \"#{$alarmTextVal}\"
$sun = #{$checkSunVal}
$mon = #{$checkMonVal}
$tue = #{$checkTueVal}
$wed = #{$checkWedVal}
$thu = #{$checkThuVal}
$fri = #{$checkFriVal}
$sat = #{$checkSatVal}"
    end
  end

  def saveButtonClick(event)
    $comboStatusVal = @comboStatus.get_value()
    $comboHourVal = @comboHour.get_value()
    $comboMinVal = @comboMin.get_value()
    $comboSecVal = @comboSec.get_value()
    $alarmTextVal = @alarmText.get_value()
    $checkSunVal = @checkSun.get_value()
    $checkMonVal = @checkMon.get_value()
    $checkTueVal = @checkTue.get_value()
    $checkWedVal = @checkWed.get_value()
    $checkThuVal = @checkThu.get_value()
    $checkFriVal = @checkFri.get_value()
    $checkSatVal = @checkSat.get_value()
    if $comboStatusVal == "On"
      $boolStatus = true
    elsif $comboStatusVal == "Off"
      $boolStatus = false
    else
      # Nothings
    end
    $whichAlarmVal = $whichAlarm.get_value()
    if $whichAlarmVal == 'Alarm # 1'
      sets1
    elsif $whichAlarmVal == 'Alarm # 2'
      sets2
    elsif $whichAlarmVal == 'Alarm # 3'
      sets3
    elsif $whichAlarmVal == 'Alarm # 4'
      sets4
    else
      # Nothing
    end
    bool1 = $onOff.fetch(0)
    bool2 = $onOff.fetch(1)
    bool3 = $onOff.fetch(2)
    bool4 = $onOff.fetch(3)
    if $whichAlarmVal == 'Alarm # 1'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{$boolStatus}, #{bool2}, #{bool3}, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 2'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, #{$boolStatus}, #{bool3}, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 3'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, #{bool2}, #{$boolStatus}, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 4'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, #{bool2}, #{bool3}, #{$boolStatus}]"
      end
    else
      # Nothing
    end
  end
  def defButtonClick(event)
    results = []
    bool1 = $onOff.fetch(0)
    bool2 = $onOff.fetch(1)
    bool3 = $onOff.fetch(2)
    bool4 = $onOff.fetch(3)
    File.open('Defaults.rb', 'r').each { |line| results << line }
    if $whichAlarmVal == 'Alarm # 1'
      File.open('Sets1.rb', 'w') do |f1|
        f1.puts results
      end
    elsif $whichAlarmVal == 'Alarm # 2'
      File.open('Sets2.rb', 'w') do |f1|
        f1.puts results
      end
    elsif $whichAlarmVal == 'Alarm # 3'
      File.open('Sets3.rb', 'w') do |f1|
        f1.puts results
      end
    elsif $whichAlarmVal == 'Alarm # 4'
      File.open('Sets4.rb', 'w') do |f1|
        f1.puts results
      end
    else
      # Nothing
    end

    if $whichAlarmVal == 'Alarm # 1'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [false, #{bool2}, #{bool3}, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 2'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, false, #{bool3}, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 3'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, #{bool2}, false, #{bool4}]"
      end
    elsif $whichAlarmVal == 'Alarm # 4'
      File.open('on-off.rb', 'w') do |f|
        f.puts "$onOff = [#{bool1}, #{bool2}, #{bool3}, false]"
      end
    else
      # Nothing
    end
  end
end

class AlarmFrame < Frame
  def initialize()
    super(nil, -1, 'Alarm')
    @aPanel = Panel.new(self)
    @someText = StaticText.new(@aPanel, -1, "Time's up! Go to bed!",
DEFAULT_POSITION, DEFAULT_SIZE, ALIGN_CENTER)
    @stopButton = Button.new(@aPanel, -1, 'Ok')
    evt_button(@stopButton.get_id()) {|event|stopButtonClick(event)}
    @aPanelSizer = BoxSizer.new(VERTICAL)
    @aPanel.set_sizer(@aPanelSizer)
    @aPanel.sizer.add(@someText, 0, GROW|ALL, 2)
    @aPanel.sizer.add(@stopButton, 0, GROW|ALL, 2)
    Sound.play("beep4.wav", flags = SOUND_ASYNC|SOUND_LOOP)
    show()
  end

  def stopButtonClick(event)
    Sound.stop()
  end
end

class Alarm
  def initialize
    $bool1 = $onOff.fetch(0)
    $bool2 = $onOff.fetch(1)
    $bool3 = $onOff.fetch(2)
    $bool4 = $onOff.fetch(3)
  end
  def one
    if $bool1 == true
      require 'Sets1.rb'
      t = Time.now
      goOff0 = $hourDef
      goOff1 = $minDef
      goOff2 = $secDef
      sleepTime =
(goOff0.to_i*3600+goOff1.to_i*60+goOff2.to_i)-(t.strftime("%H").to_i*3600+t.strftime("%M").to_i*60+t.strftime("%S").to_i)
      sleep(sleepTime)
      AlarmFrame.new
    else
      # Nothings
    end
  end
  def two
    if $bool2 == true
      require 'Sets2.rb'
      t = Time.now
      goOff0 = $hourDef
      goOff1 = $minDef
      goOff2 = $secDef
      sleepTime =
(goOff0.to_i*3600+goOff1.to_i*60+goOff2.to_i)-(t.strftime("%H").to_i*3600+t.strftime("%M").to_i*60+t.strftime("%S").to_i)
      sleep(sleepTime)
      AlarmFrame.new
    else
      # Nothings
    end
  end
  def three
    if $bool3 == true
      require 'Sets3.rb'
      t = Time.now
      goOff0 = $hourDef
      goOff1 = $minDef
      goOff2 = $secDef
      sleepTime =
(goOff0.to_i*3600+goOff1.to_i*60+goOff2.to_i)-(t.strftime("%H").to_i*3600+t.strftime("%M").to_i*60+t.strftime("%S").to_i)
      sleep(sleepTime)
      AlarmFrame.new
    else
      # Nothings
    end
  end
  def four
    if $bool4 == true
      require 'Sets4.rb'
      t = Time.now
      goOff0 = $hourDef
      goOff1 = $minDef
      goOff2 = $secDef
      sleepTime =
(goOff0.to_i*3600+goOff1.to_i*60+goOff2.to_i)-(t.strftime("%H").to_i*3600+t.strftime("%M").to_i*60+t.strftime("%S").to_i)
      sleep(sleepTime)
      AlarmFrame.new
    else
      # Nothings
    end
  end
end

class MainApp < App
  def on_init
    SetsFrame.new
  end
end

_ = Thread.new {MainApp.new.main_loop()}
a = Thread.new {Alarm.new.one}
b = Thread.new {Alarm.new.two}
#c = Thread.new {Alarm.new.three}
#d = Thread.new {Alarm.new.four}
_.join
a.join
b.join
#c.join
#d.join
-- 
Posted via http://www.ruby-forum.com/.


More information about the wxruby-users mailing list