今天在使用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. alert弹出窗口,点击确认后关闭页面

    alert("点击确认后,关闭页面"); window.opener=null;window.top.open('','_self','');window.close(this);

  2. MD5加密解密以及设置salt(盐值)

    MD5算法 package com.oracle.jsp.util; import java.security.MessageDigest; import java.security.NoSuchAl ...

  3. 实验7:交换机IOS升级

    交换机IOS升级首先需要有IOS文件,如果没有备份原文件的话,可以找个同一版本的IOS来替代. 第一种方法:X-Modem 以前我曾经尝试过一种方法,就是当Flash被删除后,启动无法进入系统,可以用 ...

  4. JAVA中如何获取变量的类型

    JAVA中如何获取变量的类型? package xiya; public class Demo { public static void main(String[] args) { String ty ...

  5. caffe solver configuration

    (用到一个加一个, 并非完整的介绍) lr_policy 基本的learning rate 在solver.prototxt中由参数base_lr配置. 配合lr_policy和其余的一些参数制定le ...

  6. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  7. mysql 支持emoji表情

    在mysql插入emoji表情,出现错误: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A' for column ' ...

  8. CentOS7下部署rsync服务

    说明: 在CentOS7下部署rsync服务和在CentOS6上部署基本上是一样的,只是CentOS7自带了rsyncd启动脚本,由systemd管理而已. rsync服务端配置 [root@SERV ...

  9. window下建立vue.js项目

    安装node.js 直接下载安装文件安装就可以了 vue项目搭建 .到自己要件项目的文件夹运行cmd命令 .如果没有安装vue-cli .npm install -g vue-cli .vue ini ...

  10. Web渗透测试漏洞手册及修复建议

    Web渗透测试漏洞手册及修复建议 0x0 配置管理 0x01 HTTP方法测试 漏洞介绍: 目标服务器启用了不安全的传输方法,如PUT.DELETE等,这些方法表示可能在服务器上使用了 WebDAV, ...