我将在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) 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) 在运行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消息的含义是什么?我怎么做才能压制消息?
我正在使用 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 …
是否可以确定我的 Vala 应用程序在哪个平台(GNU/Linux、Win32、OS X)上运行?
我在 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 哈希表)。我只需要创建一个哈希表并为一定数量的键填充相同的值,然后在后期与其中的值进行一些比较,最后将其中的每个值与固定值进行比较。
我正在尝试在我的 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) 并重新安装了它,但错误仍然相同。
有什么建议吗?
我意识到这可能是一个新手 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)
注意:以上是用于说明我的问题的最少代码,我知道主循环中的“其他任务”可能更好地由线程、 …
我对 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) 我正在尝试使用 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方法提供的内容。