| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1185 人关注过本帖
标题:[求助]异步通信中使用fixed绑定指针的问题
取消只看楼主 加入收藏
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
 问题点数:0 回复次数:7 
[求助]异步通信中使用fixed绑定指针的问题
本人写了一个socket通信的小程序,目前能实现C/S之间的正常数据传送。
现在希望能在 异步调用的OnReceiveData的方法中增加一个将收到的数据写入文件的功能。
因为指针的关系,所以必须“ 绑定 ” 内存。(绑定这个词似乎不太准确)。
使用fixed语句。

文件写入的代码部分如下:
private unsafe void AddIntoFile(string ss)
{
string strT = ss; //ss字符串是客户端传送给主机端口的数据。主机端接收到数据以后就调用 AddIntoFile函数,将收到的数据作为参数传过来
byte[] buf=new byte[4096];
System.Text.ASCIIEncoding ae = new ASCIIEncoding();
buf = ae.GetBytes(strT);
int l;
l = buf.Length;
fixed (byte* p = buf)
{
//byte* pp = p;
stlc.AddToHead(ref *p, l, 0);
/////////////////////////////////////////////////////////////////////////////////////////
stlc.AddToHead(ref *p, l, 0);
该函数是引用的dll中的。我也只知道其中的函数以及参数而已。
ref byte Telegram; 引用的要传送的报文
int Length; 报文的实际长度
int IsOverWrite 这个我不清楚,只知道用0就好。
/////////////////////////////////////////////////////////////////////////////////////////
}
}

从文件中读出的代码:
private unsafe void btnReadData_Click(object sender, EventArgs e)
{
byte[] buf = new byte[4086];
int l;
fixed (byte* p = buf)
{
try
{
if (stlc.Size > 0)
{
l = stlc.GetFromTail(ref *p, 0);
stlc.DelFromTail(1);//从尾部读出报文并删除
MessageBox.Show(Encoding.ASCII.GetString(buf, 0, l));
}
else
{
MessageBox.Show("no data");
}
}
catch (Exception et)
{
MessageBox.Show(et.Message);
}
}
}

现在测试情况是:如果在一个单独的单线程程序中运行,这两个函数都可以正确的运行,写入文件和读出文件都可以运行成功。
但是放在异步调用的Server端的接收数据的回调函数中的时候,就只能读出发送的第一个字母。
比如 :Send taserq
Read: t????? 或者是:t 。。。的某种乱码形式

搜索更多相关主题的帖子: 绑定 fixed 指针 异步 通信 
2006-08-14 09:02
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
据我理解,似乎是fixed语句中fixed (byte* p = buf) 好像是只绑定了byte[]数组中的第一个byte字节。所以,只有第一个字节可以读出。
但是,msdn的代码中:
class IncrDecr
{
unsafe static void Main()
{
int[] numbers = {0,1,2,3,4};

// Assign the array address to the pointer:
fixed (int* p1 = numbers)
{
// Step through the array elements:
for(int* p2=p1; p2<p1+numbers.Length; p2++)
{
System.Console.WriteLine("Value:{0} @ Address:{1}", *p2, (long)p2);
}
}
}
}

fixed (int* p1 = numbers) 该句代码也只是绑定了int数组的地址而已,而且在我的异步Serve中的接收数据的回调函数中也可以正确的运行出来。
然而,读写文件的两个函数却在运行中出现了问题。至今仍百思不得其解。
希望大家看看予以指正。。。


谢谢先。

2006-08-14 09:08
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
刚看到,头都要破了。我试试看。

2006-08-14 10:28
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
刚刚测试过了,确实可以用。而且,不使用指针也可以正确的运行啊。。。。
真是晕死。 还以为要用指针。
不是说不用指针会有不预期的垃圾回收吗?
这算是碰巧呢?还是不用指针也可以成功啊?


2006-08-14 11:27
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
ok了
你那個com dll是多線程的
把[stathread]改為[mtathread]
就行了


另外: 这个是什么意思?
据我理解,我的程序就是多线程的啊。。。。难道是单线程的?。。。。。。。。 晕。。。。
异步调用也算是单线程吗?应该是多线程吧。

2006-08-14 11:33
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元
若为多线程单元则是 [MTAThread]

COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。

COM 线程模型可设置为单线程单元或多线程单元。如果应用程序线程实际调用了 COM 组件,则仅为 COM interop 初始化该线程。如果没有使用 COM interop,则不初始化该线程。

这是网上的一点说明,大概都是这种说法,不过还是不怎么明白。
可以可以给点提示或者出处或者讲解之类的?

ts

2006-08-14 11:37
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
。。。。。 不好意思,最重要的问题是为什么改成MTAThread就可以成功呢?


2006-08-14 11:40
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
好的,谢谢你。
chenjin145。。。。。。

2006-08-15 08:23
快速回复:[求助]异步通信中使用fixed绑定指针的问题
数据加载中...
 
   



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

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