2014-05-21 2 views
0

좋은 하루!Mono 및 GTK를 사용하여 XFCE에서 응용 프로그램이 충돌 함 #

나는 내 자신을 알아낼 수 없다는 문제가 있으며, 이번에는 Google이 합당한 제안을하지 못했습니다. 그래서 이것이 마지막 희망입니다.

xfce 데스크탑을 실행하는 데비안으로 포팅하기를 원하는 C#과 WPF로 작성된 애플리케이션이 있습니다. 그것은 MonoDevelop와 GTK #를 사용하여 이루어졌습니다. 이 응용 프로그램은 매우 간단합니다. 지역 운송 회사 일정 제공자의 API에 연결되어 있고 근처 버스 정류장에서 다음 버스 출발을 가져옵니다.

이제 응용 프로그램이 Linux에서 실행되고 필요에 따라 시간표가 업데이트됩니다. 문제는 시작 10 ~ 60 분 후 무작위로 충돌한다는 것입니다. 오류 또는 예외 메시지가 없습니다. 로그에서 아무것도 찾을 수 없었습니다. 그것은 단순히 종료됩니다 (종료) 그리고 그것이 그 것입니다.

나는 실마리가 스레딩이나 부족 또는 그와 관련이있을 수 있습니다. 아래는 MainWindow 메소드의 주요 코드입니다. 아마도 커뮤니티가 나에게 도움을 줄 수 있으며 내가 끔찍한 일을 잘못하고 있다면 발견 할 수 있습니다.

감사합니다.

private static System.Timers.Timer timer; 

public MainWindow(): base (Gtk.WindowType.Toplevel) 
{ 
    Build(); 

    uiCustomizations(); 

    updateTimetable(); 

    timer = new System.Timers.Timer(180000); 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(updateTimetable); 
    timer.Enabled = true; 
} 

private void updateTimetable (object source = null, ElapsedEventArgs e = null) 
{ 
    try { 
     Log.myLog.AddEntry("Downloading timetable"); 

     ReittiopasConnector ro = new ReittiopasConnector (Parameters.RequestType, Parameters.Stop, Parameters.CurrentTime, Parameters.TimeLimit, Parameters.DepLimit); 
     Parser data = new Parser (ro.GetXmlStream()); 


     BusDepartures departures132 = new BusDepartures(); 
     data.GetBusSchedule (Parameters.Lines [0]); 
     departures132.SetDepatures = data.ReturnDepartureTimes(); 
     label_Left_Time1.Text = departures132.Departure; 
     label_Left_Time2.Text = departures132.FollowingDeparture; 

     BusDepartures departures503 = new BusDepartures(); 
     data.GetBusSchedule (Parameters.Lines [1]); 
     departures503.SetDepatures = data.ReturnDepartureTimes(); 
     label_Right_Time1.Text = departures503.Departure; 
     label_Right_Time2.Text = departures503.FollowingDeparture; 
     //Bus503.DataContext = departures503; 
     //})); 

    } catch (Exception ex) { 
     Log.myLog.AddEntry("Exception: " + ex.Message); 
    } 
} 
+1

디버그 모드에서 응용 프로그램을 컴파일하고 실행하여 시작하십시오. http://mono-project.com/Debugging을보십시오 – dna

+1

왜 System.Timers.Timer를 사용합니까? GTK # 응용 프로그램은'GLib.Timeout', http://docs.go-mono.com/?link=T%3aGLib.Timeout –

답변

1

동일한 스레드 (메인 스레드, UI 스레드라고도 함) 내에서 GTK/GDK API를 호출해야합니다. 그러나 코드에서 보면 Timer를 사용하고있는 것 같습니다. 즉 타이머가 시작한 스폰 된 스레드에서 UI를 만지고있는 것입니다.

그래서, 당신은 (예를 들어)와 GTK/GDK로 통화를 마무리해야합니다

Gtk.Application.Invoke (() => { 
      label.Text = "Done"; 
    }); 

더 많은 정보 here을.

+0

을 사용해야합니다. 정확히 내가 찾고 있던 것입니다! :) 답변을 주셔서 감사합니다. 이제 완벽하게 작동합니다. –