当前位置:  开发笔记 > 编程语言 > 正文

跨平台线程和GTK#,无法正常工作?

如何解决《跨平台线程和GTK#,无法正常工作?》经验,为你挑选了1个好方法。

我正在尝试使用C#,Linux上的单声道/ GTK#和Windows上的.NET/GTK#创建跨平台C#应用程序,但是在两个平台下启动顺序似乎需要略有不同:

在Linux下:

public static void Main (string[] args)
{
    Gdk.Threads.Init ();
    // etc...

在Windows下:

public static void Main (string[] args)
{
    Glib.Thread.Init ();
    Gdk.Threads.Init ();
    // etc...

两者都要求以这种方式完成:Windows抱怨g_thread_init()没有使用linux代码调用,并且linux抱怨已经使用Windows代码调用它.除此之外,这一切都非常有效.

我对"解决方案"的第一次尝试看起来像:

public static void Main (string[] args)
{
    try {
        Gdk.Threads.Init ();
    } catch (Exception) {
        GLib.Thread.Init ();
        Gdk.Threads.Init ();
    }
    // etc...

但即便是这个凌乱的解决方案也行不通; 错误来自GTK +,非托管代码,因此无法捕获.有没有人对问题的原因有什么好主意,以及如何解决它?或者,如果不这样做,有关于如何检测应在运行时调用哪一个的明智想法?



1> Johan Dahlin..:

Win32上的Gtk +不能正确支持线程.您需要从与调用Gtk.Main()相同的线程执行所有GUI调用.

它实际上并不像听起来那么糟糕.有一个技巧可以用来将函数分派给主线程.只需从任何线程使用GLib.Idle.Add(),该函数将在主循环运行的同一个线程中立即调用.只需记住在空闲处理程序函数中返回false,否则它将继续运行.

如果你遵循并使用上述技巧,你根本不需要调用Gdk.Threads.Init().

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有