在 GTKSharp 应用程序旁边不断调用方法

Constantly invoke a method alongside GTKSharp application

我正在用 GTKSharp 创建一个实时动作游戏(我知道,这不是个好主意)。我有一个需要不断调用的方法来更新我的游戏 window(某些按钮中的图像),但我不知道如何操作。

我尝试将方法放入循环中,然后 运行在应用程序线程之外的另一个线程中执行循环。


    public static void Main(string[] args) {
        Parallel.Invoke(() => RunGameLoop(), () => RunApp());
    }

    public void RunGameLoop(){
        while(runGame) { //runGame is a bool, I change it to false when I click a button in MyGameWindow
            MyGameWindow.UpdateButtons(); //MyGameWindow is a GTK.Window
        }
    }

    public void RunApp(){
        MyGameWindow.Show();
        Application.Run();
    }

Gdk:ERROR:/build/gtk+2.0-AoeliP/gtk+2.0-2.24.32/gdk/gdkregion-generic.c:1110:miUnionNonO: assertion failed: (y1 < y2)

后面跟着一堆文字)


    public static void Main(string[] args) {
        Thread i = new Thread(new ThreadStart(RunGameLoop));
        Thread l = new Thread(new ThreadStart(RunApp));

        //I also tried with this
        //Thread i = new Thread(RunGameLoop);
        //Thread l = new Thread(RunApp);

        i.Start();
        l.Start();
    }

    public void RunGameLoop(){
        while(runGame) {
            MyGameWindow.UpdateButtons();
        }
    }

    public void RunApp(){
        MyGameWindow.Show();
        Application.Run();
    }


    public static void Main(string[] args) {
        Task[] tasks = new Task[2];

        tasks[0] = Task.Run(() => RunGameLoop());
        tasks[1] = Task.Run(() => RunApp());

        Task.WaitAll(tasks);
    }

    public void RunGameLoop(){
        while(runGame) {
            MyGameWindow.UpdateButtons();
        }
    }

    public void RunApp(){
        MyGameWindow.Show();
        Application.Run();
    }


    public static void Main(string[] args) {
        Task t1 = Task.Factory.StartNew(() => RunGameLoop());
        Task t2 = Task.Factory.StartNew(() => RunApp());
        Task.WaitAll(tasks);
    }

    public void RunGameLoop(){
        while(runGame) {
            MyGameWindow.UpdateButtons();
        }
    }

    public void RunApp(){
        MyGameWindow.Show();
        Application.Run();
    }

我在这个问题上浪费了几个小时,老实说我不知道​​,我可能误解了线程的工作原理或 GTKSharp 的工作原理。我曾考虑将项目转移到像 Unity 这样的适当的东西,但我浪费了很多时间来弄清楚 GTKSharp。

我正在使用 Monodevelop 7.8.4 (build 2),项目是 GTK# 2.0 项目。

经过大量搜索解决方案后,我遇到了这个:How do I access GUI (GTK) from multi threads?. So, what I was trying to do was doomed from the beginning. After a bit more time, I found this: Winforms - Invoking a method in another thread 用于 WinForms,GTK 等价物据说是 GLib.Timeout,我也无法开始工作。

我想这在 GTK# 中是完全不可能的。我将不得不改变我的程序的工作方式。