L
lcl_003
Unregistered / Unconfirmed
GUEST, unregistred user!
我是做工控软件的,现在遇到一个奇怪的问题,百思不得其解,以前到也能凑活用着,但是现在不行
了,所以想弄清楚到底是咋回事。
我的环境是用pc和另外一个工控方面用的pc104通讯,pc104 上用的是dos。我们之间是通过netbios会
话来进行通讯的。通讯部分用vc写在dll里了,下面是dll里发送和接收的原代码:
int APIENTRY SendData( int Lsn , char data[10000])
{
struct SessionMsg far *BufferPtrFar;
unsigned long i;
//out_buf.TextLength=4;
//out_buf.Text[0]=4;
//out_buf.Text[1]=0;
//out_buf.Text[2]=66;
//out_buf.Text[3]=1;
out_buf.TextLength=data[1]*256+data[0];
for(i=0;i<out_buf.TextLength;i++)
//{ vv.ww=data;
// out_buf.Text=vv.bb[0];
//}
out_buf.Text=data;
ClearNcb(&SendNcb);
SendNcb.ncb_command=NCBRESET;
Netbios(&SendNcb);
SendNcb.ncb_command = NCBSend;
SendNcb.ncb_lsn = (char)Lsn;
BufferPtrFar=(struct SessionMsg far *) &out_buf;
SendNcb.ncb_buffer = (PUCHAR)(BufferPtrFar);
SendNcb.ncb_length = (int)out_buf.TextLength*2+4;
Netbios(&SendNcb);
return data[0];//SendNcb.ncb_retcode ;
}
int APIENTRY RecvData(int Lsn, char *data)
{
struct SessionMsg far *BufferPtrFar;
unsigned long i;
// if( RecvNcb.ncb_retcode==0 ) {
// for(i=0;i<in_buf.TextLength;i++){
// data = in_buf.Text;
// }
ClearNcb(&RecvNcb);
RecvNcb.ncb_command=NCBRESET;
Netbios(&RecvNcb);
RecvNcb.ncb_command = 0x15;//NCBRECV;
RecvNcb.ncb_lsn = (char)Lsn;
BufferPtrFar=(struct SessionMsg far *) &in_buf;
RecvNcb.ncb_buffer = (PUCHAR)(BufferPtrFar);
RecvNcb.ncb_length = sizeof(in_buf);
Netbios(&RecvNcb);
if ( RecvNcb.ncb_retcode != 0 ) {
return RecvNcb.ncb_retcode ;
}
else
{
for(i=0;i<in_buf.TextLength;i++){
data = in_buf.Text;
}
return 0 ;
}
// }
// return 1;
}
我在delphi中使用是这么声明的:
function RecvData(lsn:integer;data:array of byte):integer;stdcall;external 'netdll.dll';
function SendData(lsn:integer;data:array of byte):integer;stdcall;external 'netdll.dll';
使用的时候直接调用就行了,比如:
setlength(send,5);
setlength(recv,24);
send[0]:=6;
send[1]:=0;
send[2]:=4;
send[3]:=2;
send[4]:=0;
SendData(lsn[1],send);
RecvData(lsn[1],recv);
下面问题出来了:我现在在一个线程里循环的和pc104通讯,不停的调用SendData、RecvData,但是
有的地方我必须将SendData、RecvData的返回值付给一个变量然后显示到edit里才可以,不然就报地
址错误。而且有的地方需要用有的就不需要用,我一遇到地址冲突的错误就这样:
i:=SendData(lsn[1],send);
main.edit1.text:=inttostr(i);
i:=RecvData(lsn[1],send);
main.edit1.text:=inttostr(i);
马上就没有错误了,屡试不爽:)而且不光是在线程里,在现成外也是这样。搞不清楚到底是怎么回
事。
另外还有个奇怪的问题,比如我在线程里使用了
i:=SendData(lsn[1],send);
main.edit1.text:=inttostr(i);
i:=RecvData(lsn[1],send);
main.edit1.text:=inttostr(i);
按理来说是访问了vcl应该是不安全的应该使用同步,但是我把main.edit1.text:=inttostr(i);写
在一个过程里然后使用同步,总是报地址错误。但是如果我直接写不用同步却一点问题没有,就是
跑一段时间后线程会死掉。我估计我线程死是不是和这个问题有关?我还有一个帖子是说线程
死掉的:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1630169
大家来分析一下这几个问题:
1,为什么有时候要把SendData的返回值显示到edit里才不出错?
2,线程里是用同步居然不行,而直接访问vcl:main.edit1.text:=inttostr(i);却可以?
3,线程为什么会死掉?
了,所以想弄清楚到底是咋回事。
我的环境是用pc和另外一个工控方面用的pc104通讯,pc104 上用的是dos。我们之间是通过netbios会
话来进行通讯的。通讯部分用vc写在dll里了,下面是dll里发送和接收的原代码:
int APIENTRY SendData( int Lsn , char data[10000])
{
struct SessionMsg far *BufferPtrFar;
unsigned long i;
//out_buf.TextLength=4;
//out_buf.Text[0]=4;
//out_buf.Text[1]=0;
//out_buf.Text[2]=66;
//out_buf.Text[3]=1;
out_buf.TextLength=data[1]*256+data[0];
for(i=0;i<out_buf.TextLength;i++)
//{ vv.ww=data;
// out_buf.Text=vv.bb[0];
//}
out_buf.Text=data;
ClearNcb(&SendNcb);
SendNcb.ncb_command=NCBRESET;
Netbios(&SendNcb);
SendNcb.ncb_command = NCBSend;
SendNcb.ncb_lsn = (char)Lsn;
BufferPtrFar=(struct SessionMsg far *) &out_buf;
SendNcb.ncb_buffer = (PUCHAR)(BufferPtrFar);
SendNcb.ncb_length = (int)out_buf.TextLength*2+4;
Netbios(&SendNcb);
return data[0];//SendNcb.ncb_retcode ;
}
int APIENTRY RecvData(int Lsn, char *data)
{
struct SessionMsg far *BufferPtrFar;
unsigned long i;
// if( RecvNcb.ncb_retcode==0 ) {
// for(i=0;i<in_buf.TextLength;i++){
// data = in_buf.Text;
// }
ClearNcb(&RecvNcb);
RecvNcb.ncb_command=NCBRESET;
Netbios(&RecvNcb);
RecvNcb.ncb_command = 0x15;//NCBRECV;
RecvNcb.ncb_lsn = (char)Lsn;
BufferPtrFar=(struct SessionMsg far *) &in_buf;
RecvNcb.ncb_buffer = (PUCHAR)(BufferPtrFar);
RecvNcb.ncb_length = sizeof(in_buf);
Netbios(&RecvNcb);
if ( RecvNcb.ncb_retcode != 0 ) {
return RecvNcb.ncb_retcode ;
}
else
{
for(i=0;i<in_buf.TextLength;i++){
data = in_buf.Text;
}
return 0 ;
}
// }
// return 1;
}
我在delphi中使用是这么声明的:
function RecvData(lsn:integer;data:array of byte):integer;stdcall;external 'netdll.dll';
function SendData(lsn:integer;data:array of byte):integer;stdcall;external 'netdll.dll';
使用的时候直接调用就行了,比如:
setlength(send,5);
setlength(recv,24);
send[0]:=6;
send[1]:=0;
send[2]:=4;
send[3]:=2;
send[4]:=0;
SendData(lsn[1],send);
RecvData(lsn[1],recv);
下面问题出来了:我现在在一个线程里循环的和pc104通讯,不停的调用SendData、RecvData,但是
有的地方我必须将SendData、RecvData的返回值付给一个变量然后显示到edit里才可以,不然就报地
址错误。而且有的地方需要用有的就不需要用,我一遇到地址冲突的错误就这样:
i:=SendData(lsn[1],send);
main.edit1.text:=inttostr(i);
i:=RecvData(lsn[1],send);
main.edit1.text:=inttostr(i);
马上就没有错误了,屡试不爽:)而且不光是在线程里,在现成外也是这样。搞不清楚到底是怎么回
事。
另外还有个奇怪的问题,比如我在线程里使用了
i:=SendData(lsn[1],send);
main.edit1.text:=inttostr(i);
i:=RecvData(lsn[1],send);
main.edit1.text:=inttostr(i);
按理来说是访问了vcl应该是不安全的应该使用同步,但是我把main.edit1.text:=inttostr(i);写
在一个过程里然后使用同步,总是报地址错误。但是如果我直接写不用同步却一点问题没有,就是
跑一段时间后线程会死掉。我估计我线程死是不是和这个问题有关?我还有一个帖子是说线程
死掉的:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1630169
大家来分析一下这几个问题:
1,为什么有时候要把SendData的返回值显示到edit里才不出错?
2,线程里是用同步居然不行,而直接访问vcl:main.edit1.text:=inttostr(i);却可以?
3,线程为什么会死掉?