分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
我們繼續學習d-bus,參考相關的api介面reference參考從底層,即libdbus學習如何傳送method以及如何等待應答,在上上次學習中,給出了同步的方式,這是更為高層的處理方式,建議使用。監聽method和監聽signal的方式非常相似。在給出例子之前,我希望和上次學習一樣給出乙個示意圖,更好地了解d-bus的各個概念。
監聽method call訊息,並返回method reply訊息
method的監聽和signal的監聽的處理時一樣,但是訊號是不需要答覆,而method需要。在下面的例子中,我們將學習如何在訊息中加入多個引數(在d-bus學習(四)中,我們加入了乙個引數)的情況。
#include傳送method call訊息,並等待method reply訊息下面的例子在上次學習訊號傳送的例子上進行修改。如下:#include
#include
#include
#include
#include
/*讀取訊息的引數,並且返回兩個引數,乙個是bool值stat,乙個是整數level*/
void reply_to_method_call(dbusmessage * msg, dbusconnection * conn)
dbus_connection_flush(conn);
dbus_message_unref(reply);
}/* 監聽d-bus訊息,我們在上次的例子中進行修改 */
void listen_dbus()
if(connection == null)
return;
//設定乙個bus name:test.wei.dest
ret = dbus_bus_request_name(connection,"test.wei.dest",dbus_name_flag_replace_existing,&err);
if(dbus_error_is_set(&err))
if(ret != dbus_request_name_reply_primary_owner)
return;
//要求監聽某個singal:來自介面test.signal.type的訊號
dbus_bus_add_match(connection,"type='signal',inte***ce='test.signal.type'",&err);
dbus_connection_flush(connection);
if(dbus_error_is_set(&err))
while(true)
if(dbus_message_is_signal(msg,"test.signal.type","test"))else if(dbus_message_is_method_call(msg,"test.method.type","method"))
dbus_message_unref(msg);}}
int main( int argc , char ** argv)
#include給我老師的人工智慧教程打call!#include
#include
#include
#include
#include
//建立與session d-bus daemo的連線,並設定連線的名字,相關的**已經多次使用過了
dbusconnection * connect_dbus()
if(connection == null)
return null;
//step 2: 設定bus name,也即連線的名字。
ret = dbus_bus_request_name(connection,"test.wei.source",dbus_name_flag_replace_existing,&err);
if(dbus_error_is_set(&err))
if(ret != dbus_request_name_reply_primary_owner)
return null;
return connection;
}void send_a_method_call(dbusconnection * connection,char * param)
if(pending == null)
dbus_connection_flush(connection);
dbus_message_unref(msg);
//waiting a reply,在傳送的時候,已經獲取了method reply的handle,型別為dbuspendingcall。
// block until we recieve a reply,block until the pending call is completed.
dbus_pending_call_block(pending);
// get the reply message,gets the reply, or returns null if none has been received yet.
msg = dbus_pending_call_steal_reply(pending);
if (msg == null)
// free the pending message handle
dbus_pending_call_unref(pending);
// read the parameters
if (!dbus_message_iter_init(msg, &arg))
fprintf(stderr, "message has no arguments!/n");
else if (dbus_message_iter_get_arg_type(&arg) != dbus_type_boolean)
fprintf(stderr, "argument is not boolean!/n");
else
dbus_message_iter_get_basic(&arg, &stat);
if (!dbus_message_iter_next(&arg))
fprintf(stderr, "message has too few arguments!/n");
else if (dbus_message_iter_get_arg_type(&arg) != dbus_type_uint32 )
fprintf(stderr, "argument is not int!/n");
else
dbus_message_iter_get_basic(&arg, &level);
printf("got reply: %d, %d/n", stat, level);
dbus_message_unref(msg);
}int main( int argc , char ** argv)
linux下dbus的理解學習
最近在設計乙個linux桌面程式。而程序間的互動準備使用dbus來解決。介紹 有那麼個組織叫freedesktop,它是專門為linux桌面制定標準的。什麼kde,gnome都是按他的標準來的。而dbus是其中的桌面訊息機制的乙個標準。dbus是乙個ipc的管理系統,其實就底層來說就是本地socke...
QuickServer的學習研究(六)
在啟動quickserver的同時如果你想在服務啟動的前後,服務關閉前後執行特定的操作,那麼必須實現相關的serverhook介面。實現相關的的方法。用於控制quickserver的生命週期的各種資訊。serverhook的源 如下 package org.quickserver.net impor...
我的shader學習之六
今天覆習一下基礎,寫個光照的讀書筆記 先寫個blinn phong的光照模型 upgrade note replaced object2world with unity objecttoworld upgrade note replaced world2object with unity world...