标签: glib

GLib哈希表循环问题

我将在C程序中使用GLib的Hash表实现,现在我只是在尝试它.我编写了以下代码用于测试:

 #include <glib.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>

 int main(){
 // Some codes and declerations here
 GHashTable *g_hash_table;
 uint32_t *a;
 a=(uint32_t *)malloc(sizeof(uint32_t));
 if(a==NULL){
    printf("Not Enough Mem For a\n");
    return 1;
 }
 *a=1123231;

 uint32_t* key;
 key=(uint32_t *)malloc(sizeof(uint32_t));
 if(key==NULL){
     printf("Not Enough Mem For key\n");
     return 1;
 }
 *key=122312312;
 int i;
 g_hash_table=g_hash_table_new(g_int_hash, g_int_equal);
 for(i=0;i<TABLE_SIZE;i++){
     *key+=1;
     *a+=1;
     g_hash_table_insert(g_hash_table,(gpointer)key,(gpointer)a);
     uint32_t *x=(uint32_t *)g_hash_table_lookup(g_hash_table,key);
     printf("Counter:%d,  %u\n",i,*x);
 }

GHashTableIter iter;
g_hash_table_iter_init(&iter,g_hash_table);
int size=g_hash_table_size(g_hash_table);
printf("First size: %d\n",size);
uint32_t *val;
uint32_t *key_;
int counter=0;

// …
Run Code Online (Sandbox Code Playgroud)

c hashtable glib

3
推荐指数
1
解决办法
6866
查看次数

如何在菜单项上捕获gtk scroll-event

Gtk小部件发出信号滚动事件.我想在MenuItem上将函数连接到该信号.以下示例代码不起作用.

$ cat scroll-event-on-menu-item.c 
#include <gtk/gtk.h>

void scroll_cb(GtkStatusIcon* icon, GdkEvent* ev, gpointer userdata)
{
    g_message("scrolled!");
}

void quit_cb(GtkMenuItem* item, GdkEventButton* ev, gpointer userdata)
{
    gtk_main_quit();
}

void click_cb(GtkStatusIcon* icon, GdkEventButton* ev, gpointer userdata)
{
    GtkWidget* menu = gtk_menu_new();
    GtkWidget* item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
    gtk_widget_show(menu);
    gtk_widget_show(item);
    g_signal_connect(item, "button-press-event", G_CALLBACK(quit_cb), NULL);
    g_signal_connect(item, "scroll-event", G_CALLBACK(scroll_cb), NULL);
    gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu,
            icon, ev->button, ev->time);
}

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);

    GtkStatusIcon* icon = gtk_status_icon_new_from_stock(GTK_STOCK_INFO);
    g_signal_connect(icon, "button-press-event", G_CALLBACK(click_cb), …
Run Code Online (Sandbox Code Playgroud)

c gtk glib gdk gtk3

3
推荐指数
1
解决办法
2056
查看次数

gtkmm glib gio很关键

在运行gtkmm的以下simple.cc示例时

#include <gtkmm.h>

int main(int argc, char * argv[]){
  Glib::RefPtr<Gtk::Application> app
    = Gtk::Application::create(argc,argv,"org.gtkmm..examples.base");
  Gtk::Window window;
  //Gtk::ApplicationWindow window(app);                                         
  return app->run(window);                                                  
}
Run Code Online (Sandbox Code Playgroud)

我面对以下消息:

 (process:9428): GLib-GIO-CRITICAL **: g_application_set_application_id: assertion `application_id == NULL || g_application_id_is_valid (application_id)' failed
Run Code Online (Sandbox Code Playgroud)

但是,应用程序不会中断,窗口生成并且直到我ctr + C程序才会退出.

这个GLib-GIO-Critical消息的含义是什么?我怎么做才能压制消息?

c++ gtk glib gtkmm

3
推荐指数
1
解决办法
2969
查看次数

DBus,无法获得系统范围的名称

我正在使用 gio 和这个 DBus 实现来注册守护进程的一些内部对象。我使用 SESSION 范围的 Dbus 进行了所有测试,一切正常,但我尝试使用系统范围的注册,因为我的名称注册失败。

我正在使用 g_bus_own_name 来获取名称,我的错误情况响应 bus_acquired_handler 然后 name_lost_handler 场景。

任何想法,我如何解决这个问题,或者我如何获得有关错误的更多信息?

GIO : https://developer.gnome.org/gio/2.38/gio-Owning-Bus-Names.html#g-bus-own-name

这是 dbus-monitor 跟踪:

信号发送者=org.freedesktop.DBus -> dest=:1.96 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.96"


信号发送者=:1.95 -> dest=(空目的地)serial=3 path=/org/ast/AstCore;interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
字符串“org.ast.AstCore”
数组[
dict entry(
string“state”
variant int32 3
)
]
数组[
]


信号发送者=:1.95 -> dest=(空目的地)serial=5 path=/org/ast/AstCore;interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
字符串“org.ast.AstCore”
数组[
dict entry(
string“state”
variant int32 4
)
]
数组[
]


信号发送者=org.freedesktop.DBus -> dest=(空目的地)serial=173 path=/org/freedesktop/DBus;interface=org.freedesktop.DBus; member=NameOwnerChanged
字符串 ":1.95"
字符串 ":1.95"
字符串 ""


信号发送者=org.freedesktop.DBus -> dest=(空目的地)serial=174 …

dbus glib

3
推荐指数
1
解决办法
2971
查看次数

GLib 是否可以进行操作系统检测?

是否可以确定我的 Vala 应用程序在哪个平台(GNU/Linux、Win32、OS X)上运行?

cross-platform glib vala os-detection

3
推荐指数
1
解决办法
284
查看次数

在 g_hash_table 中使用 int 作为键

我在 C 中有一些代码,我想在其中使用 int 作为键和 gnome 哈希表中的值。但如果我写:

GHashTable* table = g_hash_table_new(g_direct_hash, g_direct_equal);
int tmp = 0;
int value = 255;
g_hash_table_insert(table, (gpointer)tmp, (gpointer) 255);
Run Code Online (Sandbox Code Playgroud)

我收到一些关于从不同大小的整数转换指针的警告,并且应用程序返回分段错误。我知道这可以通过指针来完成,但我想知道是否有办法直接使用 int 来优化过程。我也愿意尝试性能更好的新解决方案(总是在 C 中使用 gnome 哈希表)。我只需要创建一个哈希表并为一定数量的键填充相同的值,然后在后期与其中的值进行一些比较,最后将其中的每个值与固定值进行比较。

c hashtable glib

3
推荐指数
1
解决办法
3529
查看次数

找不到包含“GObject-2.0.gir”

我正在尝试在我的 Ubuntu 14.04 上安装 totem-pl-parser-3.10.7,在autogen.sh+configure成功结束后,我使用make. 但我收到以下错误:

Couldn't find include 'GObject-2.0.gir' (search path: ['.', '.', '/usr/share/gnome-fallback/gir-1.0', '/usr/share/gnome/gir-1.0', '/usr/local/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0', '/usr/share/gir-1.0'])
Run Code Online (Sandbox Code Playgroud)

在谷歌上搜索可能的原因,发现gobject-introspection是在 之后安装了软件包libglib-2.0-dev,因此.gir无法正确找到存储库。

另外,我删除了libglib-2.0-dev( apt remove --purge) 并重新安装了它,但错误仍然相同。

有什么建议吗?

ubuntu gobject glib gobject-introspection

3
推荐指数
1
解决办法
2945
查看次数

基于 C 中的“退出”标志正确终止 GLib 主循环

我意识到这可能是一个新手 GLib 问题,但我很难在下面找到解决我的问题的代码示例。所以在我走错路之前,我希望得到你的建议。

我的代码侦听 D-Bus 消息。一条 D-Bus 消息是一条“退出”消息,旨在指示主循环关闭。如果主循环中没有其他任务,一个简单的解决方案可能是简单地调用g_main_loop_run()下面的代码,并在g_main_loop_quit()收到“退出”消息时执行 D-Bus 消息处理代码(此处未显示)。

但是,我更喜欢由主循环做出退出的决定,除了侦听 D-Bus 消息之外,它又可以执行各种其他任务。设置工作 D-Bus 服务器后,以下代码按预期执行此操作:

GMainLoop *glib_mainloop = g_main_loop_new( NULL, false );
/* Set up the D-Bus connection to work in the GLib event loop. */
dbus_connection_setup_with_g_main( dbus_connection, NULL );

/* Run the GLib event loop. */
GMainContext *glib_context = g_main_context_default( );
while( quit_indicator == false )
{
    g_main_context_iteration( glib_context, /*allow blocking=*/false );
    /* Do a variety of other tasks. */
}

g_main_loop_quit( glib_mainloop );
Run Code Online (Sandbox Code Playgroud)

注意:以上是用于说明我的问题的最少代码,我知道主循环中的“其他任务”可能更好地由线程、 …

c glib

3
推荐指数
1
解决办法
2077
查看次数

GLib-GObject-CRITICAL ...断言“夸克&gt; 0”失败

我对 Gtk 编程还很陌生。我正在使用 Gtkmm 库为我的应用程序编写一个简单的 GUI。

GUI 是一个更大的应用程序的一部分,它实际上编译成两个单独的可执行文件,但是我认为这无关紧要,因为这个问题只涉及两个可执行文件之一。

无论如何,我在client.cpp中有以下代码:

#include "client.hpp"

int main() {
    auto builder = Gtk::Builder::create();
}
Run Code Online (Sandbox Code Playgroud)

在 client.hpp 中,我只包含 iostream、glibmm.h 和各种 gtkmm 小部件头文件,以及 gtkmm/builder.h。

我的 makefile 一团糟,但它是:

CXXFLAGS= -std=c++14 -g
LDFLAGS=-lgmp -pthread $(shell pkg-config -libs gtkmm-3.0)
SERVER_EXE=server
CLIENT_EXE=client
CXX=g++
DIST_DIR=.
BUILD_DIR=./build

SERVER_CXXFLAGS=
CLIENT_CXXFLAGS=$(shell pkg-config --cflags gtkmm-3.0)

INCLUDE_DIRS=./include
INCLUDE_PARAMS=$(foreach d, $(INCLUDE_DIRS), -I$d)

SERVER_OBJECTS=rsa.o server_entry.o server.o
SERVER_OBJECT_PATHS=$(foreach o, $(SERVER_OBJECTS), $(BUILD_DIR)/$o)

CLIENT_OBJECTS=resources.o client.o
CLIENT_OBJECT_PATHS=$(foreach o, $(CLIENT_OBJECTS), $(BUILD_DIR)/$o)

all: $(SERVER_OBJECT_PATHS) $(CLIENT_OBJECT_PATHS)
    mkdir -p $(DIST_DIR)
    $(CXX) $(CLIENT_OBJECT_PATHS) -o $(DIST_DIR)/$(CLIENT_EXE) $(LDFLAGS)
    $(CXX) $(SERVER_OBJECT_PATHS) …
Run Code Online (Sandbox Code Playgroud)

c++ glib gtkmm gtk3

3
推荐指数
1
解决办法
1085
查看次数

如何使用 vala/glib 管道到进程

我正在尝试使用 GLib 的spawn_command_line_sync方法将echo 的输出通过管道传输到命令中。我遇到的问题是 echo 将整个命令解释为参数。

为了更好地解释,我在我的代码中运行它:

string command = "echo \"" + some_var + "\" | command";
Process.spawn_command_line_sync (command.escape (), 
                                 out r, out e, out s);
Run Code Online (Sandbox Code Playgroud)

我希望变量被回显到管道中,并且命令通过管道传输的数据运行,但是当我检查结果时,它只是在 echo 之后回显所有内容,如下所示:

"some_var's value" | command
Run Code Online (Sandbox Code Playgroud)

我想我可以只使用Posix该类来运行命令,但我喜欢使用结果、错误和状态值来侦听该spawn_command_line_sync方法提供的内容。

glib vala elementary-os

3
推荐指数
2
解决办法
764
查看次数