我正在使用glib,
它有很多函数可以返回应该自己释放的字符串.
我可以将这些功能传递给其他功能吗?
示例: function1返回必须为调用者释放的字符串. function2返回一个指向必须释放的字符串的指针.
gchar *string = function2(function1("something"));
g_free (string);
Run Code Online (Sandbox Code Playgroud)
我应该如何释放从function1返回的字符串?这有必要吗?
非常感谢,
对不起我的英语
当使用glib来发送信号时emit,是否所有"侦听器"/处理程序都是背靠背调用,或者是在每个侦听器/处理程序之后将控件放弃到事件循环中?
所以我正在尝试使用GtkSourceViewmm在C++中使用GtkSourceView,其文档和支持程度给我的印象是它在很长一段时间内都没有经过仔细研究.但我总是乐观主义者:)
我正在尝试使用类似于以下内容的代码添加SourceView:
Glib::RefPtr<gtksourceview::SourceLanguageManager> source_language_manager = gtksourceview::SourceLanguageManager::create();
Glib::RefPtr<gtksourceview::SourceLanguage> source_language = Glib::wrap(gtk_source_language_manager_guess_language(source_language_manager->gobj(), file, NULL));
Glib::RefPtr<gtksourceview::SourceBuffer> source_buffer = gtksourceview::SourceBuffer::create(source_language);
gtksourceview::SourceView* = m_source_view = new gtksourceview::SourceView(source_buffer);
m_vbox.pack_start(*m_source_view);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它吐出了警告
(algoviz:4992):glibmm-WARNING**:无法包装"GtkSourceLanguage"类型的对象.提示:此错误通常是由于未能调用库init()函数引起的.
当我在调试器中查看它时,确实上面的第二行(带有的那一行Glib::wrap())正在返回NULL.我不知道为什么会这样,但我试图通过添加Glib::init()到程序的开头来注意警告,但这似乎根本没有帮助.
我试过谷歌,但一直没有成功.有谁知道Glib要我初始化才能能够进行换行调用?或者,更好的是,是否有人知道使用GtkSourceViewmm的任何工作示例代码(不仅仅是常规的GtkSourceView)?我无法找到任何实际的示例代码,甚至在Google代码搜索中也找不到.
谢谢!
我正在尝试对我正在使用GLib编写的一些C代码运行简单的单元测试.我正在尝试做类似的事情:
#include <math.h>
#include <stdio.h>
#include <glib.h>
static void
test_stuff ()
{
g_assert (1 == 1); //Say
}
int main (int argc, char **argv)
{
g_test_init (&argc, &argv);
g_test_add_func ("/TestTest", test_stuff);
return g_test_run();
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译(比如一个名为exec的二进制文件)并尝试使用gtester运行它(甚至直接运行所述二进制文件)时,我收到以下错误:
me@laptop:tests$ gtester exec
TEST: exec... (pid=6503)
(process:6503): GLib-CRITICAL **: g_test_init: assertion `vararg1 == NULL' failed
FAIL: exec
Terminated
Run Code Online (Sandbox Code Playgroud)
有没有我遗漏的东西,也许我应该在运行测试时传递变量?
我正在尝试使用GStreamer作为我们在内部开发的软电话的视频后端.我们的软电话不是基于GLib的,有自己的事件循环.是否可以设置gst管道并在没有GMainLoop的情况下进入各种状态?
代码:
GValue value = { 0 };
Run Code Online (Sandbox Code Playgroud)
发出以下警告:
缺少初始值设定项[-Wmissing-field-initializers]
我知道那是一个gcc's BUG; 但有一些技巧可以删除它吗?真的不太好看到这种不真实的警告.但我不希望断电警告,因为它也会隐藏我的真实警告.很抱歉,但我无法将我的gcc更新为4.7(看起来它已修复)版本.
我希望循环遍历哈希表中的每个键值对.因此我使用了g_hash_table_foreach()函数(Prototype如下所示).对于每个键值对,它调用void func方法.
void g_hash_table_foreach(GHashTable *hash_table,GHFunc func,
gpointer user_data);
Run Code Online (Sandbox Code Playgroud)
但是,我要求每次调用该函数时,该方法返回一个值.
例如,请考虑以下代码:
void calculate(gpointer key, gpointer value, gpointer userdata)
{
return calculateNumbers(key, value);
}
int total = 0;
g_hash_table_foreach(mymap, calculate, NULL);
Run Code Online (Sandbox Code Playgroud)
我要求变量total存储calculate()函数接收的每个返回值的总和.我发现使用g_hash_table_foreach方法很难做到这一点.
我宁愿有一个while循环,在外部声明总变量,并在每对迭代时增加其值.但是,我不认为glib允许我一次控制一个键值对.(与具有下一个属性的GList不同)任何想法我怎么能这样做呢?
我想在我的iOS应用程序中使用lasem,但编译lasem需要glib.如何建立它?
我从https://git.gnome.org/browse/glib/refs/tags下载glib-2.37.4 .然后我使用autogen.sh来获取配置文件,运行make并在mac上安装.我写了一个shell脚本尝试为iOS构建glib,如下:
export path=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/:$path
export CC=arm-apple-darwin10-llvm-gcc-4.2
export CFLAGS="-arch armv7"
export LDFLAGS="-miphoneos-version-min=2.0"
export LD="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld--disable-cxx"
./configure --prefix=/usr/local/ios/ --host=arm-apple-darwin10 --enable-static=yes --enable-shared=no CC=$CC CFLAGS=$CFLAGS CPP=cpp AR=ar LDFLAGS=$LDFLAGS LD=$LD
Run Code Online (Sandbox Code Playgroud)
当我运行此脚本时,返回为:
checking for arm-apple-darwin10-gcc... arm-apple-darwin10-llvm-gcc-4.2
checking whether the C compiler works... no
configure: error: in `/Users/tinyfool/Downloads/glib-2.34.3':
configure: error: C compiler cannot create executables
Run Code Online (Sandbox Code Playgroud)
我能做什么?
我最近接触过GLib并正在玩它.我已经能够用GLib函数替换大量的C库函数(除此之外,我是命令行处理的忠实粉丝!).但是,有一件事我无法找到很多文档来自操作系统的信号处理.即在Linux中,有没有更好的方法可以处理CTRL + C或其他信号来终止应用程序?目前我使用signal(),但我想知道是否有一种方法可以通过GLib为CTRL + C设置我的处理程序.
一如既往,感谢您的帮助.
我有以下问题:我有一个类需要保护免受不同线程的同时访问.该类有两个方法:lock()和unlock()using(g_mutex_lock/ g_mutex_unlockwith per-object GMutex).现在锁定方法如下所示:
void Object::method()
{
lock();
// do stuff modifying the object
unlock();
}
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我有两个这种类型的mwthods,method1()以及method2()我称之为此起彼伏:
object.method1();
// but what if some other thread modifies object in between
object.method2();
Run Code Online (Sandbox Code Playgroud)
我尝试在此块之前锁定对象并再次解锁它,但在这种情况下,即使使用单个线程也会出现死锁,因为GMutex它不知道它已被同一个线程锁定.解决方案是修改方法以接受附加bool以确定对象是否已被锁定.但是有更优雅的概念吗?或者这总是关于设计概念的缺点?