今天在使用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. Nodejs实战系列:数据加密与crypto模块

    博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...

  2. python笔记04

    数据类型(二) 今日内容 1.列表 2.元组 内容回顾和补充 1.计算机基础 ①硬件:cpu,内存,硬盘,主板,网卡 ②操作系统:linux,centos, Ubuntu,redhat windows ...

  3. Paper慢慢读 - AB实验人群定向 Double Machine Learning

    Hetergeneous Treatment Effect旨在量化实验对不同人群的差异影响,进而通过人群定向/数值策略的方式进行差异化实验,或者对实验进行调整.Double Machine Learn ...

  4. Web框架之Gin介绍及使用

    Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...

  5. 脚本、脚本语言、shell脚本

    脚本是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等.脚本程序相对一般程序开发来说比较接近自然语言,可 ...

  6. Codeforces 1087C Connect Three (思维+模拟)

    题意: 网格图选中三个格,让你选中一些格子把这三个格子连起来,使得选中的格子总数最小.最后输出方案 网格范围为1000 思路: 首先两点间连起来最少需要的格子为他们的曼哈顿距离 然后连接方案一定是曼哈 ...

  7. 《N诺机试指南》(五)进制转化

    进制转化类题目类型: 代码详解及注释解答:  //进制转化问题 #include <bits/stdc++.h> using namespace std; int main(){ // 1 ...

  8. 初学maven的一些配置

    初学Maven的一些配置 1.maven的安装 2.从官网下载3.6.1版本后,高级版本可能会出现不兼容 jdk1.8 3.配置maven 在 settings.xml <settings> ...

  9. 深入理解ASP.NET Core依赖注入

    概述        ASP.NET Core可以说是处处皆注入,本文从基础角度理解一下原生DI容器,及介绍下怎么使用并且如何替换官方提供的默认依赖注入容器. 什么是依赖注入        百度百科中对 ...

  10. Golang robfig/cron 实现解析

    ​    robfig/cron是GO语言中一个定时执行注册任务的package,  最近我在工程中使用到了它,由于它的实现优雅且简单(主要是简单),所以将源码过了一遍,记录和分享在此. 文档:htt ...