有没有人知道一个易于与GLib一起使用的MD5/SHA1/etc例程(即你可以给它一个GIOChannel等)?
为什么utf8符号无法通过glib函数打印?
源代码:
#include "glib.h"
#include <stdio.h>
int main() {
g_print("?????\n");
fprintf(stdout, "?????\n");
}
Run Code Online (Sandbox Code Playgroud)
像这样构建:
gcc main.c -o main $(pkg-config glib-2.0 --cflags --libs)
Run Code Online (Sandbox Code Playgroud)
你可以看到glib无法打印utf8和fprintf可以:
[marko@marko-work utf8test]$ ./main
?????
?????
Run Code Online (Sandbox Code Playgroud) 有没有办法改变glib中的日志级别,例如在应用程序的发行版中,g_debug的调试消息不会记录到stdout?我真的需要为此实现自己的日志处理程序(g_log_set_handler)吗?
我想将垃圾收集语言(具体来说,它使用古老的Boehm libgc)与glib系列API接口.
glib和gobject在内部使用引用计数来管理对象的生命周期.包装它们的常规方法是使用垃圾收集的对等对象,该对象保存对glib对象的引用,并在对等方最终确定时删除引用; 这意味着当应用程序使用对等时,glib对象保持活动状态.我以前做过这个,但它确实有效,但它很痛苦并且有自己的问题(例如生成同一个底层对象的两个对等体).
鉴于我无论如何都有垃圾收集器的所有开销,理想情况下我想做的只是关闭glib的引用计数并使用垃圾收集器来处理所有事情.这样可以简化界面,无疑可以提高性能.
从表面看来,这似乎相当简单 - 将一个垃圾收集器终结器连接到glib对象终结器,并将ref和unref函数覆盖为noops ---但进一步的调查显示它还有更多:glib例如,他非常喜欢保留自己的分配器池,当然我让它这样做垃圾收集器假设池中的所有东西都是活的并且它会泄漏.
说服glib使用libgc实际上是否可行?如果是这样,我可能面临的其他问题是什么?什么样的glib性能影响会强制所有分配通过libgc产生(而不是使用当前在glib中的优化分配器)?
(glib文档确实说它应该干净地与垃圾收集器接口......)
问题
我正在使用GLib 2.0库,并声明了一个gunit64变量.我希望将其值显示在屏幕上,但它无法正常工作.
码
以下面的代码片段为例.我声明了一个guint64变量,并尝试打印它的值.
guint64 myValue = 24324823479324;
printf("My Value: %d\n", myValue);
Run Code Online (Sandbox Code Playgroud)
警告
我收到这个警告:
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘guint64’
Run Code Online (Sandbox Code Playgroud)
产量
我在屏幕上看到一个奇怪的负数:
我的价值:-1871285220
进一步评论
我试图搜索API的文档,我在guint64下找到了以下内容:
所有平台上的无符号整数保证为64位.此类型的值范围为0到G_MAXUINT64(= 18,446,744,073,709,551,615).
要打印或扫描此类型的值,请使用G_GINT64_MODIFIER和/或G_GUINT64_FORMAT.
因此,我假设我必须使用修饰符或格式定义.但是,文档未显示如何使用它们.有人能帮帮我吗?
目前在Ubuntu 15.10的更新版本和更新的Anaconda2的最新版本
$ python -V
Python 2.7.11 :: Anaconda 2.5.0 (64-bit)
Run Code Online (Sandbox Code Playgroud)
我在终端得到这个但是spyder打开了,看起来很好.
GLib-GIO-Message: Using the 'memory' GSettings backend. Your settings will not be saved or shared with other applications.
(python:21685): Gtk-WARNING **: GModule (/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so) initialization check failed: GLib version too old (micro mismatch)
(python:21685): Gtk-WARNING **: Loading IM context type 'ibus' failed
(python:21685): Gtk-WARNING **: GModule (/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so) initialization check failed: GLib version too old (micro mismatch)
(python:21685): Gtk-WARNING **: Loading IM context type 'ibus' failed
(python:21685): Gtk-WARNING **: GModule (/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Boehm垃圾收集器与GLib集成在Linux中,但在一种情况下,我发现它并没有释放内存:当我多次调用g_strsplit时,它会耗尽内存和段错误.垃圾收集器的README警告它可能无法在动态库中查找指针,并且可能需要使用GC_add_roots.
为了测试这一点,我将GLib中的所有相关代码复制到我的源文件中,而不是根据libglib-2.0.so进行链接.这消除了段错误,这告诉我这确实是问题所在.但是,没有关于如何使用GC_add_roots来解决此问题的文档.有人能帮我吗?
以下是导致内存泄漏的代码:
#include <glib.h>
#include <gc.h>
void no_free(void *mem) {}
int main() {
g_mem_gc_friendly = TRUE;
GMemVTable memvtable = {
.malloc = GC_malloc,
.realloc = GC_realloc,
.free = no_free,
.calloc = NULL,
.try_malloc = NULL,
.try_realloc = NULL
};
g_mem_set_vtable(&memvtable);
for (int i = 0; i < 10000; i++) {
char **argv = g_strsplit("blah", " ", 0);
argv[0][0] = 'a'; // avoid unused variable warning
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 上下文
我正在将 C/GTK+ GUI 应用程序转换为 C#。我在 VS2017 中使用 GTKSharp 绑定版本 3.22.0。
该应用程序声明了几个信号,例如
g_signal_new ("SIG_NAME", params...);
Run Code Online (Sandbox Code Playgroud)
并通过 发出它们g_signal_emit_by_name(... "SIG_NAME"...)。
问题
我找不到一种方法将该行为转换为 GTK#。
我研究了 GTK# 的源代码,了解如何定义和处理自定义信号,就像这里一样,但我无法模仿那里实现的行为。
该方法
我尝试过像这样定义自定义对象:
using System;
using Gtk;
public class MyApp
{
public class MyCustomObj : GLib.Object
{
public delegate void MyDelegateSignalHandler(int arg0, int arg1);
public delegate void MyDelegate(int arg0, int arg1);
public class MyDelegateArgs : GLib.SignalArgs
{
public int a { get; set; }
}
public MyCustomObj() : base()
{}
[GLib.Signal("MyEvent")]
public …Run Code Online (Sandbox Code Playgroud) 我在 OSX 12.0.1 Monterey 上安装了 gstreamer。我刚刚在运行 python 3.9 的虚拟环境中安装了 python 绑定:
pip3 install pycairo PyGObject
我可以毫无问题gi地导入。gi.repository.Gst然而,似乎几乎所有 gstreamer 插件都丢失了。这是我的测试脚本:
import gi
gi.require_versions({'Gst': '1.0'})
from gi.repository import Gst, GLib
Gst.init(None)
Gst.debug_set_active(True)
Gst.debug_set_default_threshold(5)
if not Gst.init_check()[0]:
print("gstreamer initialization failed")
class Main:
def __init__(self):
self.pipeline = Gst.parse_launch('playbin uri=https://gstreamer.freedesktop.org/data/media/small/sintel.mkv')
self.pipeline.set_state(Gst.State.PLAYING)
self.main_loop = GLib.MainLoop.new(None, False)
GLib.MainLoop.run(self.main_loop)
self.bus = self.pipeline.get_bus()
self.msg = self.bus.timed_pop_filtered(
Gst.CLOCK_TIME_NONE,
Gst.MessageType.ERROR | Gst.MessageType.EOS
)
if self.msg is not None:
self.msg.unref()
self.bus.unref()
self.pipeline.set_state(Gst.State.NULL)
self.pipeline.unref()
Main()
Run Code Online (Sandbox Code Playgroud)
它失败了:
0:00:00.006178000 92472 0x7fbd7d049210 INFO …Run Code Online (Sandbox Code Playgroud)