Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# g_main_loop_run()冻结窗口_C#_C_Pinvoke_Gstreamer - Fatal编程技术网

C# g_main_loop_run()冻结窗口

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;

我正在尝试使用Pinvoke从GStreamer库导入的函数在C#中创建视频播放器。到目前为止看起来不错,但是如果我添加
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相关的问题。查看您的平台线程支持,了解如何在应用程序中生成和控制线程。或者,您也可以跳过主循环线,而代之以您的应用程序可以执行正在那里完成的工作—比如查询管道总线中的消息—这是您最可能感兴趣的。