今天在使用c++\cli的时候遇到了点关于委托,callback使用的问题,简单记录一下

首先贴段简单的C#中使用System.Threading.Timer的代码.
    Timer GameTimer=new Timer(new TimerCallback(this.OnGameTimer),null,0,500);

以上定时器会每隔500毫秒去调用OnGameTimer方法,OnGameTimer方法的定义如下:

void OnGameTimer(object obj){...}

基于以上代码,结合C#的使用方法,我们来写出C++\CLI的使用代码.

Timer^ GameTimer=gcnew Timer(gcnew TimerCallback(this->OnGameTimer),NULL,500);

void OnGameTimer(Object^ obj){...}

很好,vs并没有提示什么语法错误,那么编译的结果呢?

     Error120error C3867: 'GameServer::FrmMain::OnGameTimer': function call missing argument list; use '&GameServer::FrmMain:OnGameTimer' to create a pointer to member    
 
     按照提示,它需要一个方法函数的指针,也给了代码"&...",修改如下:     
     Timer^ GameTimer=gcnew Timer(gcnew TimerCallback(&FrmMain::OnGameTimer),NULL,500);    
     可是这次还没编译,就提示语法错误了,      编译给出的错误信息为:     
     Error120error C3352: 'void GameServer::FrmMain::OnGameTimer(System::Object ^)' : the specified function does not match the delegate type 'void (System::Object ^)'    
    这个错误提示让人实在摸不差头脑了,指定的方法函数和delegate委托不相匹配.
    好吧,一番搜索,msdn示例代码 链接如下:
    经过反复翻看代码好几遍,才终于弄清楚的正确的写法,如下:  
    Timer^ GameTimer=gcnew Timer(gcnew TimerCallback(this,&FrmMain::OnGameTimer),NULL,500);
    后来才看到,其实在没有加this参数的时候,语法的错误提示是准确的,Error invalid delegate initalizer -- function does not match the delegate type.
    c++\cli,一直没有去系统学习,只是刚好常用c#,又懂些c++,就直接使用了,但是过程中的确经常遇到一些可能非常基础的问题,但也正是这些基础问题卡住自己.
    它是c++和.net的混合,不管单独从那一个的习惯去写代码可能都会有点别扭,或许把它当作一门新的编程语言,这些奇怪的地方法也就不奇怪了. 关于它,如果想享受.net的快捷,又不愿意放弃以前c++现有的东西,或者需要和一些底层接口打交道,那么它值得去拥抱! 

题外话:

最近着手在重写一个很古老的游戏服务端,目前已使用C#按照原来的c++代码重写完了GateServer,LoginServer,RoleServer,GuildServer,但是GameServer选择使用C++\CLI进行重构.这份代码估计出生在1998年左右,没有使用任何设计模式,就连很多大量相同的代码都没有进行简单的封装,GameServer中的主要逻辑都写在game.cpp中,这个cpp足足有2M多,7-8w行代码揉在一起.如果GameServer也使用C#重写的话,那就无法预知工作量了.好在CLI的存在,让这份庞大杂乱的c++代码没花多少功夫就被.net化了,经测试运行进游戏一切正常.      剩下把它那稀烂的网络通信用我C#写的XKSocket替换掉,那一切就不在是问题了!      XKSocket git地址: http://git.oschina.net/dreamzgj/XKSocket

C++\CLI使用.net委托,*Callback注意"this"的更多相关文章

  1. 30天C#基础巩固------了解委托,string练习

    ---->了解委托.     生活中的例子:我要打官司,我需要找一个律师,法庭上面律师为当事人辩护,它真正执行的是当事人的陈词,这时律师 就相当于一个委托对象.当事人则委托律师为自己辩解.    ...

  2. C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅱ部分

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  3. c#重要特性之一委托

    委托的构成必须满足的4个条件: 声明委托类型: 必须有一个方法包含了要执行的代码: 必须创建一个委托实例: 必须调用(invoke)委托实例 委托包装的方法需要满足以下条件 方法的签名必须与委托一致, ...

  4. C#当中的多线程_线程池

    3.1 简介 线程池主要用在需要大量短暂的开销大的资源的情形.我们预先分配一些资源在线程池当中,当我们需要使用的时候,直接从池中取出,代替了重新创建,不用时候就送回到池当中. .NET当中的线程池是受 ...

  5. 对[yield]的浅究到发现[async][await]

    原文:对[yield]的浅究到发现[async][await] 上篇对[foreach]的浅究到发现[yield]写完后,觉得对[yield]还没有理解清楚,想起曾经看过一位大牛的帖子讲的很深刻(链接 ...

  6. Asp.Net Core 轻松学-基于微服务的后台任务调度管理器

    前言     在 Asp.Net Core 中,我们常常使用 System.Threading.Timer 这个定时器去做一些需要长期在后台运行的任务,但是这个定时器在某些场合却不太灵光,而且常常无法 ...

  7. [设计模式] javascript 之 命令模式

    模式定义: [定义]: 将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 组成: 调用者(Invoker),命令请求(Comman ...

  8. Unity时钟定时器插件——Vision Timer源码分析之一

    因为项目中,UI的所有模块都没有MonBehaviour类(纯粹的C#类),只有像NGUI的基本组件的类是继承MonoBehaviour.因为没有继承MonoBehaviour,这也不能使用Updat ...

  9. C#子线程执行完后通知主线程

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿. 那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就 ...

随机推荐

  1. 八、django学习之分组查询、F查询和Q查询

    分组查询.F查询和Q查询 分组查询 统计每个出版社出版的书籍的平均价格 第一种方式 obj = models.Book.objects.values('publishs_id').annotate(a ...

  2. 聊聊“装箱”在CLR内部的实现

    原文连接:https://mattwarren.org/2017/08/02/A-look-at-the-internals-of-boxing-in-the-CLR/ 作者 Matt Warren. ...

  3. Node.js实战--资源压缩与zlib模块

    Blog:<NodeJS模块研究 - zlib> Github:https://github.com/dongyuanxin/blog nodejs 的 zlib 模块提供了资源压缩功能. ...

  4. Intellij idea智能提示设置

    忽略大小写敏感: 打开设置(CTRL+ALT+S)搜索editor,找到"Code Completion"->点击Case sensitive completion后面的选择 ...

  5. context.startActivity(Intent intent)方法启动activity

    在一个Activity环境中用该方法启动一个一个activity不会出任何问题,但在activity之外的其他组件中使用该方法就会出现以下错误: Calling startActivity() fro ...

  6. Visual Studio 常见问题

    VS 2013相关问题 VS 2013 Ultimate Update 5 下载地址: 英文版: vs2013.5_ult_enu.iso SHA-1:918EA4A911858D32C9771480 ...

  7. HDU 5558 Alice's Classified Message(后缀数组+二分+rmq(+线段树?))

    题意 大概就是给你一个串,对于每个\(i\),在\([1,i-1]\)中找到一个\(j\),使得\(lcp(i,j)\)最长,若有多个最大\(j\)选最小,求\(j\)和这个\(lcp\)长度 思路 ...

  8. Git 分支设计规范

    概述 这篇文章分享 Git 分支设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 在说 Git 分支规范之前,先说下在系统开发过程中常用的环境. 简称 全称 ...

  9. 【人类观察所】"当代人"正经历的生活

    一."即时满足"的互联网 "轻微烦躁,偶尔自燃,当代生活多数时刻的心情基调." 如果你出生于上个世纪,应该能明白木心的<从前慢>里的 「从前的日色变 ...

  10. [RHEL8]开启BBR

    # sysctl net.ipv4.tcp_congestion_control net.ipv4.tcp_congestion_control = cubic # sysctl net.ipv4.t ...