今天在使用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. 使用AOP和Semaphore对项目中具体的某一个接口进行限流

    整体思路: 一 具体接口,可以自定义一个注解,配置限流量,然后对需要限流的方法加上注解即可! 二 容器初始化的时候扫描所有所有controller,并找出需要限流的接口方法,获取对应的限流量 三 使用 ...

  2. 2019年,我花了3个月时间备考PMP

    ​ 经过几个月的准备,终于在2019年12月7日完成了PMP的考试,并于1月21日查到了成绩,喜获5A,意料之中.总结这次考试的具体情况:涉及题型虽然都没有超出大纲的范围,但是原题出现的概率似乎不高, ...

  3. 理解RabbitMQ中的AMQP-0-9-1模型

    前提 之前有个打算在学习RabbitMQ之前,把AMQP详细阅读一次,挑出里面的重点内容.后来找了下RabbitMQ的官方文档,发现了有一篇文档专门介绍了RabbitMQ中实现的AMQP模型部分,于是 ...

  4. OpenCV3入门1—环境搭建与实验

    1.环境搭建 1.1 VS2017开发环境搭建 1).下载软件包 https://opencv.org/ 2).配置环境变量 配置win10系统环境变量,把下面路径添加到path. D:\WORK\5 ...

  5. Codeforces 1017D The Wu(状态压缩+预处理)

    题意: 给你n m q,表示在这一组数据中所有的01串长度均为n,然后给你一个含有m个元素的multiset,之后有q次询问.每次询问会给你一个01串t和一个给定常数k,让你输出串t和multiset ...

  6. 最简单的windows 10 软路由

    因为轻信了 小米路由器3潘多拉固件刷机教程 年前把自己的小米路由器3pro 刷程砖了,然后自己有一台 i5256 的三众小主机,连在电信光猫上,可以拨号,勉强可以用,but 家里的设备那么多尤其手机笔 ...

  7. 轻松搞懂Python递归函数的原理与应用

    递归: 在函数的定义中,函数内部的语句调用函数本身. 1.递归的原理 学习任何计算机语言过程中,“递归”一直是所有人心中的疼.不知你是否听过这个冷笑话:“一个面包,走着走着饿了,于是就把自己吃了”. ...

  8. 自动化测试用例中的raise

    1.一次自动化测试学习中,expect异常中包含“raise e”,这是什么意思呢? 2.网上查了一下,大概意思是:若有异常,不会执行一下的操作,但是明明是语句后确实没有其他语句呀. 3.注释掉之后, ...

  9. Linux系统下常见的数据盘分区丢失的问题以及对应的处理方法

    在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 前提条件 在修复数据前,您必须先对分区丢失的数 ...

  10. #614 C. NEKO's Maze Game[简易DFS,0|1转换]

    起初一直看不懂题的意思,最后看了大佬的视频讲解才明白了题的意思. 题意:每次询问重复的时候抵消上一次操作  如果是奇数次的操作则视为障碍阻挡前进 收获:0和1的转换技巧,简单搜索和巧定义全局变量,没必 ...