1

gtk# と opengl を使用して、シンプルで基本的なモデリング プログラムを作成しようとしています。gtk gui と opengl の両方を使用できるようにするために、glwidget を使用しています。最近、同じ vbox にメニュー バーと glwidget の両方があることに問題がありました (それらは異なるスロットにありますが、同じ vbox にあります)。これが私のコードです:

//MainWindow.cs
using System;
using Gtk;
using CubeGameModeler;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using GLib;

public partial class MainWindow: Gtk.Window
{   
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }
    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
    protected void OnExit (object sender, EventArgs e)
    {
        Application.Quit ();
    }
    protected void OnSaveAs (object sender, EventArgs e)
    {
        SaveWindow savewindow = new SaveWindow ();
        savewindow.Show ();
    }
    protected void OnSettings (object sender, EventArgs e)
    {
        SettingsWindow settingswindow = new SettingsWindow ();
        settingswindow.Show ();
    }
    protected void OnAbout (object sender, EventArgs e)
    {
        AboutWindow aboutwindow = new AboutWindow ();
        aboutwindow.Show ();
    }
    protected void OnOpen (object sender, EventArgs e)
    {
        OpenWindow openwindow = new OpenWindow ();
        openwindow.Show ();
    }
    protected void OnHelp (object sender, EventArgs e)
    {
        HelpWindow helpwindow = new HelpWindow ();
        helpwindow.Show ();
    }
    protected void glwidget2_RenderFrame (object sender, EventArgs e)
    {
        GL.Viewport (0, 0, 100, 100);
        GL.ClearColor (0.5f, 0.5f, 1.0f, 1.0f);
        GL.Clear (ClearBufferMask.ColorBufferBit);
        GL.MatrixMode (MatrixMode.Modelview);
        GL.LoadIdentity ();
    }

}  

これは私の MainWindow.cs クラスのコードです。opengl レンダリングについてはまだ心配していません。ウィンドウを 1 秒以上開いたままにしようとしているだけです。これがバグなのか、それとも私の粗末なラップトップに関係しているだけなのかはわかりません。Debian Wheezy i386 で MonoDevelop を使用しています。プログラムを実行しようとすると、一瞬開いてから閉じます。アプリケーションの出力を見ると、次のように表示されます。

Loaded assembly: /home/mprogrammer/Documents/Monodevelop_Projects/CubeGameModeler/CubeGameModeler/bin/Debug/CubeGameModeler.exe
Loaded assembly: /usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f/gtk-sharp.dll [External]
Loaded assembly: /usr/lib/mono/gac/glib-sharp/2.12.0.0__35e10195dab3c99f/glib-sharp.dll [External]
Loaded assembly: /usr/lib/mono/gac/atk-sharp/2.12.0.0__35e10195dab3c99f/atk-sharp.dll [External]
Loaded assembly: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll [External]
Loaded assembly: /usr/lib/mono/gac/gdk-sharp/2.12.0.0__35e10195dab3c99f/gdk-sharp.dll [External]
Loaded assembly: /usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll [External]
Loaded assembly: /home/mprogrammer/Documents/Monodevelop_Projects/CubeGameModeler/CubeGameModeler/bin/Debug/OpenTK.dll [External]
Loaded assembly: /usr/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll [External]
Stacktrace:

  at (wrapper managed-to-native) Gtk.Application.gtk_main () <IL 0x00022, 0xffffffff>
  at Gtk.Application.Run () <IL 0x00000, 0x0001f>
  at CubeGameModeler.MainClass.Main (string[]) [0x00011] in /home/mprogrammer/Documents/Monodevelop_Projects/CubeGameModeler/CubeGameModeler/Main.cs:13
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

Native stacktrace:

    /usr/bin/mono() [0x80e863d]
    /usr/bin/mono() [0x8128bac]
    /usr/bin/mono() [0x8064d1f]
    [0xb76f240c]
    /lib/i386-linux-gnu/i686/cmov/libpthread.so.0(__pthread_mutex_lock+0x1d) [0xb769618d]
    /usr/lib/i386-linux-gnu/libX11.so.6(+0x2999d) [0xb64d599d]
    [0x156]

Debug info from gdb:


=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

試行錯誤の結果、問題はメニュー バーにあると判断しました。これは、メニュー バーをウィンドウに残して非表示にすると、glwidget に問題がなく、プログラムが引き続き実行されるためです。
さらに情報が必要な場合は、お知らせください。

4

1 に答える 1

0

私は同じ問題に遭遇しました。メニューだけでなく、ボタンとエントリのウィジェットも。私はそれを解決する方法を見つけました。プログラムの開始時にツールキットを初期化すると、問題が解決しました。コードは次のとおりです。

public static void Main (string[] args)
{
  using(Init())
  {
    Application.Init ();
    MainWindow win = new MainWindow ();
    win.Show ();
    Application.Run ();      
  }
}

private static OpenTK.Toolkit Init()
{
  return Toolkit.Init(new ToolkitOptions
  {
      Backend = PlatformBackend.PreferNative
  });
}
于 2015-07-16T18:25:33.863 に答える