由于设计到的问题比较复杂,我把问题的几个特征描述下:1,错误出现在一个线程里面。2,如果不创建线程,而是在主线程里面执行该线程的代码,完全没有问题。3,线程中包含一条调用语句,如果在调试状态下,执行到该语句的时候,跳入,然后单步执行,经不会发生错误。但如果不跳入,而是直接运行跳过该句,就会报错,错误:debug assertion failed!
解决方案 »
- 这句Point Point::operator+(Point a)不懂。
- 软件开发中如何有效减少GDI对象的占用?
- 一个很困扰我的CDilog的问题
- 基于对话框资源的ActiveX的问题
- 因为我的一个简单问题让我感觉没有高手!
- 如何在和html页面绑定的控件里面得到页面的http头信息
- ado 的生成数据文件
- 在线提问送分!!COM在mozilla上支持吗?我要实现通过浏览器对本机串口进行通讯,应该选择什么技术?
- 怎样得到局域网中各机的IP地址以及各机的名字(最好是打开的可以连接上的计算机名字)
- ***sourcesafe问题***
- 求freetype库在windows使用的详细步骤!!!!
- 紧急求助!关于VC图像处理
=========================
搞不定就贴代码
driver_M4.SetConnectParam("192.168.0.8",8080);
if(!driver_M4.Connect())
{
MessageBox("连接设备失败","盘点",MB_OK);
} CreateThread(NULL,0,VIPProc,this->m_hWnd,0,NULL);
线程函数代码:DWORD WINAPI VIPProc(LPVOID paraMeter)
{
while(true)
{
driver_M4.SetReadTagIDParam(0,"SELECT id FROM tag_id;");
if(driver_M4.ReadTagID())
{
MessageBeep(-1);
}
else
{
::MessageBox((HWND)paraMeter,"读取失败","VIP",MB_OK);
}
} return 0;
}
错误就出在driver_M4.ReadTagID()这句上面,如果跳入这句,单步执行,没有问题,如果直接执行这句,就会报错。driver_M4.ReadTagID()的代码如下:
bool DriverMagic::ReadTagID()
{
/* 函数代码区开始 */
if(!isOpen)
{
iReturnValue = 7;
return false;
}
if(s.SendTo(czSQLCommend,sizeof(czSQLCommend),iPort,czIP) == SOCKET_ERROR )
{
iReturnValue = 8;
return false;
}
CString addr;
unsigned int port;
if(s.ReceiveFrom(czFreeBuffer,sizeof(czFreeBuffer),addr,port) == SOCKET_ERROR )
{
iReturnValue = 8;
return false;
}
if(isError(czFreeBuffer))
{
iReturnValue = 9;
for(int i=0;!(czFreeBuffer[i] == '\n');i++)
;
strcpy(czError,czFreeBuffer);
return false;
}
ChangePrivateToPublic(1,czFreeBuffer);
return true;
/* 函数代码区结束 */
}
其它线程同时在执行什么?有没有访问driver_M4?
{
/* 参数定义区开始 */
int i = 0,j,count = 0;
/* 参数定义区结束 */
/* 函数代码区开始 */
switch(type)
{
case 1: i = 0,count = 0;
if((strlen(buffer) == 0)||(buffer[0] == '\n')||(buffer[1] == '\n'))
{
sTagID.iNumber = 0;
return;
}
while(1)
{ while(!((buffer[i] == '0')&&(buffer[i+1] == 'x'||buffer[i+1] == 'X')))//寻找"0x"
++i;
i += 2;
for(j = 0;j < 16;j++,i++)
sTagID.czTid[count][j] = buffer[i];
sTagID.czTid[count][j] = '\0';
++count;
while(!(buffer[i] == '\n'))
++i;
if(buffer[i+1] == '\n')
break; }
sTagID.iNumber = count;
break;
case 2: break;
default:break;
}
/* 函数代码区结束 */
}====================很重要的一点是,我单步执行是可以用的,整体执行不能用。
跟进看看到底是什么断言错误
断言的截图。是ReceiveFrom报错
driver_M4本来是一个全局变量,
只在创建进程前用过:
driver_M4.SetConnectParam("192.168.0.8",8080);
if(!driver_M4.Connect())
{
MessageBox("连接设备失败","盘点",MB_OK);
} CreateThread(NULL,0,VIPProc,this->m_hWnd,0,NULL);