当前位置: 首页 > 编程语言 > C#

跨平台线程和GTK#,不起作用?共享

时间:2023-04-10 19:57:02 C#

跨平台线程和GTK#,不起作用?我正在尝试使用C#、Linux上的Mono/GTK#和Windows上的.NET/GTK#创建跨平台C#应用程序,但启动顺序似乎需要在这两个平台下略有不同:在Linux下:publicstaticvoidMain(string[]args){Gdk.Threads.Init();//等等...在Windows下:publicstaticvoidMain(string[]args){Glib.Threads.Init();Gdk.Threads.Init();//etc...两个需求都是这样完成的:windows抱怨g_thread_init()没有用linux代码调用,linux抱怨它已经用windows代码调用了。除此之外,一切都很完美。我第一次尝试“解决方案”看起来像:publicstaticvoidMain(string[]args){try{Gdk.Threads.Init();}catch(Exception){GLib.Thread.Init();Gdk.Threads.Init();}//等等...但即使是这个混乱的解决方案也行不通;该错误来自GTK+,非托管代码,因此无法捕获。有没有人对问题的原因有什么好的想法,以及如何解决它?或者,如果没有这个,我如何检测应该在运行时调用哪个?Win32上的Gtk+不能正确支持线程。您需要从调用Gtk.Main()的同一线程执行所有GUI调用。它实际上并不像听起来那么糟糕。您可以使用技巧将函数分派到主线程。只需从任何线程使用GLib.Idle.Add(),该函数将在运行主循环的同一线程中调用。请记住在空闲处理程序函数中返回false,否则它将继续运行。如果您遵循并使用上述技术,则根本不需要调用Gdk.Threads.Init()。我不确定这是否适用于Mono,但您可以使用Environment类来确定程序运行的操作系统。publicstaticvoidMain(string[]args){PlatformIDplatform=Environment.OSVersion.Platform;if(platform==PlatformID.Win32NT||platform==PlatformID.Win32S||platform==PlatformID.Win32Windows)Glib.Thread.Init();elseif(platform!=PlatformID.Unix)thrownewNotSupportedException("该平台不支持该程序");Gdk.Threads.Init();//etc...PlatformID枚举不仅包括Windows和Unix,因此您应该检查其他值。实际上,这可能是GDK的C#绑定或您的GDK版本中的错误。根据gdk_threads_init()、g_thread_init()、gdk_threads_init()、g_thread_init()的文档,必须先调用,GTK#文档也是这么说的:Gdk.Threads.Init()mustbecalledbeforeGdk.Threads.Init().在我的Linux机器上(使用GDK2.14.4),一个调用gdk_threads_init()而不调用g_thread_init()的C程序打印一条错误消息并以错误终止。您是否确定Linux和Windows上的GDK版本相同,并且Linux上的版本(如果它与Windows版本不同)也需要调用g_thread_init(),或者它在两个版本之间发生了变化。最后,检查这个程序是否因错误而终止:#includeintmain(intargc,char**argv){gdk_threads_init();返回0;}用gcc-otest`pkg-config--cflags--libsgdk-2.0`test.c编译它gcc-otest`pkg-config--cflags--libsgdk-2.0`test.c(假设你有将其保存为test.c。)如果此程序因错误而终止,则这是您的GDK#库中的错误。如果不是,那是您的GDK版本中的错误。嗯,您是否尝试过使用[STAThread]属性装饰您的Main方法?例如#if!Mono//或任何[STAThread]#endifpublicstaticvoidMain(string[]args){Gdk.Threads.Init();...}如果没有你可以使用这样的条件编译...以上是C#学习教程:跨平台线程和GTK#,不起作用?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——publicstaticvoidMain(string[]args){Gdk.Threads.Init();#if!Mono//或任何Gdk.Threads.Init();#endif...}本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢