C# g_main_loop_run()冻结窗口
我正在尝试使用Pinvoke从GStreamer库导入的函数在C#中创建视频播放器。到目前为止看起来不错,但是如果我添加C# g_main_loop_run()冻结窗口,c#,c,pinvoke,gstreamer,C#,C,Pinvoke,Gstreamer,我正在尝试使用Pinvoke从GStreamer库导入的函数在C#中创建视频播放器。到目前为止看起来不错,但是如果我添加g\u main\u loop\u run(loop)我的C#应用程序冻结,我无法单击任何按钮或移动窗口 我认为这个问题可能涉及到gmaincontext,但我不知道到底是什么问题,也不知道如何解决 这是我的库中的C++代码: GstElement *pipeline; void seek_to_pos(double position) { gint64 len;
g\u main\u loop\u run(loop)代码>我的C#应用程序冻结,我无法单击任何按钮或移动窗口
我认为这个问题可能涉及到gmaincontext
,但我不知道到底是什么问题,也不知道如何解决
这是我的库中的C++代码:
GstElement *pipeline;
void seek_to_pos(double position) {
gint64 len;
gst_element_query_duration(pipeline, GST_FORMAT_TIME, &len);
gst_element_seek_simple(pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, len*position);
}
void play_file(char* path_to_file, void* hwnd_ptr_of_window){
gst_init(NULL, NULL);
HWND hwnd = (HWND)hwnd_ptr_of_window;
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_element_factory_make("playbin", "player");
g_object_set (G_OBJECT (pipeline), "uri", path_to_file, NULL);
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), (guintptr)hwnd);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);//problem
}
没有g_主循环运行(循环)代码>字符串,一切正常,但我当然需要它来做其他事情
另外,我已经知道我需要在一个数据库中运行GMainLoop
不同的线程不会阻止我的C#应用程序的事件循环,但我不知道如何才能做到这一点
因此,我需要一个代码样本或链接,它描述了我如何才能做到这一点。谢谢 无关紧要的一点:GSteamer实际上是用C编写的,而不是C++可能不是真正与GStreamer相关的问题。查看您的平台线程支持,了解如何在应用程序中生成和控制线程。或者,您也可以跳过主循环行,相反,您的应用程序可以承担正在那里完成的工作—比如查询管道总线中的消息—这是您最可能感兴趣的。不相关的一点:GSteamer实际上是用C编写的,而不是C++可能不是真正与GStreamer相关的问题。查看您的平台线程支持,了解如何在应用程序中生成和控制线程。或者,您也可以跳过主循环线,而代之以您的应用程序可以执行正在那里完成的工作—比如查询管道总线中的消息—这是您最可能感兴趣的。