用户操作
[即时聊天] [发私信] [加为好友]
虎0406ID:hu0406
17184次访问,排名6941好友2人,关注者2
苦心人,天不负,破釜沉舟,百二秦川终归蜀;有志者,事竟成,卧薪尝胆,三千越甲可吞吴。
hu0406的文章
原创 17 篇
翻译 0 篇
转载 40 篇
评论 13 篇
虎0406的公告
苦心人,天不负,破釜沉舟,百二秦川终归蜀;有志者,事竟成,卧薪尝胆,三千越甲可吞吴。
最近评论
呀呀:谢谢你的提供和劳动
边诗涵:谢谢
流星雨:太酷了,好有用啊!!!!!
爱情:太帅了 ,谢了
枫叶520:谢谢
文章分类
收藏
    相册
    My photo
    编程
    充电港湾
    codeProject
    Kevins
    MSDN
    VCer
    判官的Blog
    协议及相关
    开发者的乐园
    看雪学院
    老罗的缤纷天地
    邮件技术咨询网
    邹青峰野狼一个愚笨的程序员的成长之路
    技术Blog
    c0ffee1982的专栏
    stealthwalker
    西邮陈老师
    休闲小酌
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 RPC 编程(三)收藏

    新一篇: RPC编程(四) | 旧一篇: RPC 编程(二)

    我们在上一节的基础上,讨论如何实现异步的 RPC 调用。前两节演示的函数调用都是同步的,即调用函数 Hello() 时, 客户端将阻塞住直到服务端的 Hello() 函数返回。如果服务端函数需要进行一些费时的操作,例如复杂的计算、查询, 客户端只能一直阻塞在那里。这种情况下,我们可以使用异步的 RPC 提高客户端的性能。 异步的RPC是通过配置文件(.acf)来启用的: -------------------------------------------- Hello.acf: [          implicit_handle(handle_t HelloWorld_Binding)   ]   interface  HelloWorld {        [async] Hello();  // 增加了 [async] 表明这是异步调用 }   原来的接口 HelloWorld 有两个方法,Hello() 和 Shutdown(),Shutdown() 我们仍然让它是同步调用,所以在.acf文 件中不用列出。IDL 接口文件还是可以不用修改。 服务端的代码 server.c 中的 Hello() 要改成下面的样子: ------------------------------------------------------ void Hello(PRPC_ASYNC_STATE rpcAsyncHandle, const unsigned char * psz) {      // 模拟一个长时间的操作      printf("Sleep 5 seconds...\n");      Sleep(5000);        printf("%s\n", psz);      // 表明调用已经完成      RpcAsyncCompleteCall(rpcAsyncHandle, NULL); } 服务端的其它代码不用修改。   客户端client.c中的调用方式也要换: --------------------------------- int main(int argc, char * argv[]) {      // 前面都相同      ...          // 下面是调用服务端的函数      RpcTryExcept      {          if ( _stricmp(argv[1], "SHUTDOWN") == 0 )          {               Shutdown();          }          else          {               // 初始化异步调用               RPC_ASYNC_STATE async;               RpcAsyncInitializeHandle( &async, sizeof(async) );               async.UserInfo = NULL;               async.NotificationType = RpcNotificationTypeNone;               // 本函数能立即返回               Hello( &async, (unsigned char*)argv[1]);               // 查询调用的状态               while ( RpcAsyncGetCallStatus(&async) == RPC_S_ASYNC_CALL_PENDING )               {                    printf("Call Hello() pending, wait 1s...\n");                    Sleep(1000);               }               // 通知调用已经完成               RpcAsyncCompleteCall( &async, NULL );          }      }      RpcExcept(1)      {          printf( "RPC Exception %d\n", RpcExceptionCode() );      }      RpcEndExcept          // 后面都相同      ... } 这样客户端就实现了异步调用!

    发表于 @ 2008年06月12日 08:57:14|评论(loading...)|收藏

    新一篇: RPC编程(四) | 旧一篇: RPC 编程(二)

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 虎0406