在 GTKSharp 应用程序旁边不断调用方法
Constantly invoke a method alongside GTKSharp application
我正在用 GTKSharp 创建一个实时动作游戏(我知道,这不是个好主意)。我有一个需要不断调用的方法来更新我的游戏 window(某些按钮中的图像),但我不知道如何操作。
我尝试将方法放入循环中,然后 运行在应用程序线程之外的另一个线程中执行循环。
- 用 Parallel.Invoke 试过了(虽然这只是 运行 一个接一个,但无法同时 运行 它们)
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# 中是完全不可能的。我将不得不改变我的程序的工作方式。
我正在用 GTKSharp 创建一个实时动作游戏(我知道,这不是个好主意)。我有一个需要不断调用的方法来更新我的游戏 window(某些按钮中的图像),但我不知道如何操作。
我尝试将方法放入循环中,然后 运行在应用程序线程之外的另一个线程中执行循环。
- 用 Parallel.Invoke 试过了(虽然这只是 运行 一个接一个,但无法同时 运行 它们)
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# 中是完全不可能的。我将不得不改变我的程序的工作方式。