| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 863 人关注过本帖
标题:c#调用回调问题
只看楼主 加入收藏
chenfeng21g
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-24
结帖率:50%
收藏
 问题点数:0 回复次数:6 
c#调用回调问题
// delegate
public void RefListCallBack(uint dwCallbackData, uint dwAddr, uint dwVarID, int nData)
 {
    Console.WriteLine("Id=" + dwVarID.ToString() + " Data=" + nData.ToString());
   // dwCallbackData ... will be 2345 (user specified)
   // dwAddr ........... lasalid of changed server
  // dwVarID .......... will be 88 or 99 (user specified)
 // nData ............ changed value (datasize <= 32bit) or crc32 of changed data (datasize > 32bit)
  //... // user has to act on changed value         
        
   }

 private void button1_Click(object sender, RoutedEventArgs e)
        {
           
            Lasal32.CB_RLADD_FUNCTYPE methptr = new Lasal32.CB_RLADD_FUNCTYPE(RefListCallBack);
           // GC.KeepAlive(methptr);
            this.iRlb = Lasal32.LslRefreshListCreateExt("TCP:10.10.150.37;ApplID=10", 0, 0, 0, null, methptr, 2345, 10000);
            if (this.iRlb != 0)
            {
                if (Lasal32.LslRefreshListGetVarInfo(this.iRlb, "Obj_Csharptest1.ListServer", ref this.var1) == true)
                    Lasal32.LslRefreshListAdd(this.iRlb, ref this.var1, 88, 100, Lasal32.CpReflist.RF_DYNAMIC); // add entry to refreshlist
                if (Lasal32.LslRefreshListGetVarInfo(this.iRlb, "Obj_Csharptest1.Position", ref this.var2) == true)
                    Lasal32.LslRefreshListAdd(this.iRlb, ref this.var2, 99, 100, Lasal32.CpReflist.RF_DYNAMIC);  // add entry to refreshlist
                // ... add some more if you want

                Lasal32.LslRefreshListStart(this.iRlb, Lasal32.CpReflist.RF_DYNAMIC); // start refreshlist
                // ... watch outputwindow
               
            }
        }
老师们,请问下 我如何读取RefListCallBack里面的数据呢,每次会弹出“对“OnlineSigmatek!OnlineSigmatek.Lasal32+CB_RLADD_FUNCTYPE::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。”
搜索更多相关主题的帖子: server void specified 
2013-01-23 13:09
chenfeng21g
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-24
收藏
得分:0 
public delegate void CB_RLADD_FUNCTYPE(uint pCallbackData, uint dwAddr, uint dwVarID, int nData);
这个是lasal32里面的一个委托。
我在RefListCallBack里面加了这几句
  Id = dwVarID;
  switch (Id)
        {
                case 88:
                    Data1 = nData;
                    break;
                case 99:
                    Data2 = nData;
                    break;
         }
希望能根据不同的ID获得不同的data ,问题就是老是报上面的错误,我是个C#初学者,老师们 ,求解释!!!!
2013-01-23 13:13
chenfeng21g
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-24
收藏
得分:0 
老师们,有知道的吗 很着急 求回复!!!!!
2013-01-23 13:33
chenfeng21g
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-24
收藏
得分:0 
Window1.xaml.rar (1.44 KB)
我把完整代码贴上去,求大神指点。。。。。
2013-01-23 13:36
baikil
Rank: 10Rank: 10Rank: 10
来 自:X星球
等 级:青峰侠
威 望:4
帖 子:282
专家分:1580
注 册:2009-7-20
收藏
得分:0 
.CB_RLADD_FUNCTYPE methptr = new Lasal32.CB_RLADD_FUNCTYPE(RefListCallBack);  私有成员,用完就放入了回收中了,Lasal32中有再用到这个委托时就回收了,可以声明为全局成员,不回收就没有问题啊。

 // delegate
        public void RefListCallBack(uint dwCallbackData, uint dwAddr, uint dwVarID, int nData)
        {
            Console.WriteLine("Id=" + dwVarID.ToString() + " Data=" + nData.ToString());
            // dwCallbackData ... will be 2345 (user specified)
            // dwAddr ........... lasalid of changed server
            // dwVarID .......... will be 88 or 99 (user specified)
            // nData ............ changed value (datasize <= 32bit) or crc32 of changed data (datasize > 32bit)
            //... // user has to act on changed value
            Lasal32.CB_RLADD_FUNCTYPE ptr = new Lasal32.CB_RLADD_FUNCTYPE(RefListCallBack); 委托不是这么用的
            Id = dwVarID;
          //  Data = nData;
            switch (Id)
            {
                case 88:
                    Data1 = nData;
                    break;
                case 99:
                    Data2 = nData;
                    break;
            }
收到的鲜花
  • chenfeng21g2013-02-22 11:53 送鲜花  3朵   附言:多谢老师的帮助,很有帮助 谢谢

自创QQ群64885635,方便C#学习交流.希望各项工作路好学都好入!
2013-02-05 17:41
chenfeng21g
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-24
收藏
得分:0 
回复 5楼 baikil
老师您好,那具体要怎么弄 才能防止委托被回收呢。我设断点测试了,PLC值变化时,c#是有反应的,但是会报错误,委托已回收。求指导。
2013-02-19 16:01
kst20121117
Rank: 1
等 级:新手上路
帖 子:5
专家分:2
注 册:2013-2-4
收藏
得分:0 
路过,看看讨论结果!

阳光网域/网站建设/网页设计/远程OA/EC/虚拟主机-Q1750355218
2013-02-25 14:18
快速回复:c#调用回调问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036991 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved