问题描述
串口在dll里,接收数据后需要回调窗体里的方法并显示数据,怎么回调?先谢了!
解决方案
解决方案二:
函数指针,C#中的委托
解决方案三:
在你的dll里定义一个事件publiceventEventHandlermyevent;在你的窗体中定义回调函数void你的回调函数(objectsender,EventArgse){...}使用dll类型.myevent+=你的回调函数
解决方案四:
事件委托,版主说得对
解决方案五:
问题是那个DLL是不是你写的,如果是你写的,按楼上说的用委托,然后DLL里引发事件。如果不是那就麻烦了,看看那个DLL有没有回调函数。
解决方案六:
人家写的dll吗?他可能写了一个串口类封装起来了有两个办法第一自己写串口功能(蛮简单的)第二你看看他的dll库有没有什么接口,接收完数据肯定有message对吧?看有没有事件触发?如果有像serialport类里面datareceived事件,你订阅此事件,然后对buffer里面数据进行操作,在你的form里面订阅,处理函数就是你要回调的方法,显示就不说了方法多了去了如果帖主还需要继续聊的话,可以私聊加q都行带你解决了你给分就行
解决方案七:
窗体是自己的,dll也是自己的,而且dll下还有dll。不会用啊,用那个delegate,好像dll之间可以,窗体没整上
解决方案八:
请教事件注册为什么会出错//声明关于事件的委托publicdelegatevoiddgCountEventHandler(objectsender,System.EventArgse);//被调用的自己定义的计时类publicclassclsTimer{System.Timers.TimermTimer=newSystem.Timers.Timer(10);//声明事件publiceventdgCountEventHandlerdgeCount;publicclsTimer(){mTimer.Interval=10;mTimer.Elapsed+=newElapsedEventHandler(TimeEvent);}publicvoidsubStart(){mTimer.Enabled=true;}publicvoidsubEnd(){mTimer.Enabled=false;}privatevoidTimeEvent(objectsource,ElapsedEventArgse){//触发事件this.dgeCount(this,newEventArgs());}}//调用那个类的主类publicclassclsLogic{clsPort.clsTimermyTimer=newclsTimer();intintCount=0;publicclsLogic(){//注册事件,但是这里出错,//错误1“clsPort.clsTimer”不包含“dgeCount”的定义,并且找不到可接受类型为“clsPort.clsTimer”//的第一个参数的扩展方法“dgeCount”(是否缺少using指令或程序集引用?)//E:mideaTestsC#TESTthreadTestclsLogicclsLogic.cs2821clsLogic//错误2“clsLogic.clsLogic.myTimer”是“字段”,但此处被当做“类型”来使用//E:mideaTestsC#TESTthreadTestclsLogicclsLogic.cs2837clsLogicmyTimer.dgeCount+=newmyTimer.dgCountEventHandler(onLogic_Count);}publicvoidsubStartTime(){myTimer.subStart();}publicvoidsubEndTime(){myTimer.subEnd();}publicvoidonLogic_Count(objectsender,System.EventArgse){intCount+=1;}}
解决方案九:
注册事件出错,myTimer.dgeCount+=newmyTimer.dgCountEventHandler(onLogic_Count);是我强输入的,根本就没出提示错误1“clsPort.clsTimer”不包含“dgeCount”的定义,并且找不到可接受类型为“clsPort.clsTimer”的第一个参数的扩展方法“dgeCount”(是否缺少using指令或程序集引用?)E:mideaTestsC#TESTthreadTestclsLogicclsLogic.cs2821clsLogic错误2“clsLogic.clsLogic.myTimer”是“字段”,但此处被当做“类型”来使用E:mideaTestsC#TESTthreadTestclsLogicclsLogic.cs2837clsLogic
解决方案十:
不要把代码放在C#Test目录,换到一个没#的目录试试。记得这是某一个版本的VS的Bug,哪个版本记不清了。
解决方案十一:
另外你的这个事件用不着自己定义委托,用现成的EventHandler就好。peventEventHandlerdgeCountublic;还有触发事件时,加上判断:if(dgeCount!=null){dgeCount1(this,newEventArgs());}
解决方案十二:
publiceventEventHandlerdgeCount;
解决方案十三:
引用
clsPort.clsTimermyTimer=newclsTimer();
为什么左边要加上clsPort,右边却没有myTimer.dgeCount+=newdgCountEventHandler(onLogic_Count);dgCountEventHandler既然是写在类外侧,直接用就行了
解决方案十四:
E:mideaTestsC#TESTthreadTestclsLogicclsLogic.cs,把你目录中的C#TEST改成CSharpTest,就是不要包含#号
解决方案十五:
再按正常的变量声明方式声明就可以了clsTimermyTimer=newclsTimer();
解决方案:
找到问题在哪里了,我这两个类是放在不同项目里,那个dll引用后加的自定义事件,忘记编译了
解决方案:
这个委托和自定义事件是刚学习的,才入点门,大家有什么好的学习建议,请指点下
解决方案:
只要看+=这个在哪里,那么事件的真正执行的方法体就在哪里。
解决方案:
帖子有非法词组,只好用图片了。
解决方案:
既然DLL都是自己的,你可要用用反射,估计这个问题就好解决。
解决方案:
voidYourMethod(xxxx,Func<yyy,zzz>func){//balabala你自己应该要执行的代码if(func!=null)//这个是窗体在方法内传入的在你前面的逻辑执行完后,应该要执行的方法{func(mmm);//执行传入的委托,mmm按实际,这里假定mmm是你需要告诉窗体的数据}}