主题:为什么多线程使用时老是出现空指针错误?附源代码如下
我是多个客户端连接服务器端,服务器端收到客户端的请求后,到数据库里查询数据,然后返回给客户端,服务端用TServerSocket,方式为stNonBlocking,数据库连接用TADOConnection,查询用TADOQuery,数据库用的是sql server,建了一个100万的数据表,服务器从数据库里查询出来一个结果的时间是比较快,我用6个客户端同时连接服务器端,然后不断地发送6000个请求,老是出现以下错误:
1、eaccessviolation
2、Function call terminated by unhandled exception oxeedfade at address 0x7c812a5b
3、invaliation pointer operator
不知道怎么解决咯,请各位协助?
附我的源代码如下:
<--Frmmain.cpp-->//主窗体
//------------------------------------------------------------------------
void __fastcall TMain::ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
Socket->Close();
}
//------------------------------------------------------------------------
void __fastcall TMain::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
TRecvStreamThread *RecvThread;
try
{
//如果目前连接的数量大于设置的最大数量,则不接收该客户端的请求
//MaxThreadMaxNum:设置的最大允许连接数
//TotalThreadNum:当前的连接数
if (TotalThreadNum>MaxThreadMaxNum)
{
//关闭连接
Socket->Close();
return;
}
else
{
RecvThread = new TRecvStreamThread(true);
if (RecvThread==NULL)
{
MessageBoxA(NULL,"创建线程失败!","系统提示",0 );
return;
}
RecvThread->FreeOnTerminate = true; // 线程执行完毕自动释放资源
RecvThread->Priority = tpLower; // set the priority lower than normal
RecvThread->RemoteAddress=Socket->RemoteAddress ;
RecvThread->hWndNo =RecvThread->Handle;
RecvThread->TermScoket=Socket->SocketHandle;
RecvThread->Resume(); // 开始执行线程
}
}
catch(...)
{
MessageBoxA(NULL,"出现错误!","系统提示",0 );
if (!RecvThread==NULL)
{
RecvThread->Free();
TotalThreadNum--;
}
return;
}
}
<--Frmmain.h-->
//------------------------------------------------------------------------
#ifndef FrmMainH
#define FrmMainH
//------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
#include <FileCtrl.hpp>
#include <ImgList.hpp>
#include <NMFtp.hpp>
#include <Psock.hpp>
#include <ScktComp.hpp>
#include <ToolWin.hpp>
#include <IniFiles.hpp>
#include <ComCtrls.hpp>
#include <NMFtp.hpp>
#include <Psock.hpp>
#include <ScktComp.hpp>
#include <Dialogs.hpp>
//------------------------------------------------------------------------
class TMain : public TForm
{
__published:// IDE-managed Components
TServerSocket *ServerSocket;
TTimer *Timer1;
TLabel *lblClientNum;
TLabel *Label1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall N3Click(TObject *Sender);
private:// User declarations
bool __fastcall Logo_Oper(void);
bool __fastcall ConnectDataBase();
long packHadle[50];
bool accessRight[50];
AnsiString shutdownkind;
int MaxThreadMaxNum;//最大允许连接数量
protected:
public:// User declarations
int ServerPort;
int TotalThreadNum;//当前连接总数量
AnsiString ServerAddress;
AnsiString DataConnectString;//数据库连接字符串
AnsiString ExeFilePath;//系统所在路径
__fastcall TMain(TComponent* Owner);
};
//------------------------------------------------------------------------
extern PACKAGE TMain *Main;
//------------------------------------------------------------------------
#endif
1、eaccessviolation
2、Function call terminated by unhandled exception oxeedfade at address 0x7c812a5b
3、invaliation pointer operator
不知道怎么解决咯,请各位协助?
附我的源代码如下:
<--Frmmain.cpp-->//主窗体
//------------------------------------------------------------------------
void __fastcall TMain::ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
Socket->Close();
}
//------------------------------------------------------------------------
void __fastcall TMain::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
TRecvStreamThread *RecvThread;
try
{
//如果目前连接的数量大于设置的最大数量,则不接收该客户端的请求
//MaxThreadMaxNum:设置的最大允许连接数
//TotalThreadNum:当前的连接数
if (TotalThreadNum>MaxThreadMaxNum)
{
//关闭连接
Socket->Close();
return;
}
else
{
RecvThread = new TRecvStreamThread(true);
if (RecvThread==NULL)
{
MessageBoxA(NULL,"创建线程失败!","系统提示",0 );
return;
}
RecvThread->FreeOnTerminate = true; // 线程执行完毕自动释放资源
RecvThread->Priority = tpLower; // set the priority lower than normal
RecvThread->RemoteAddress=Socket->RemoteAddress ;
RecvThread->hWndNo =RecvThread->Handle;
RecvThread->TermScoket=Socket->SocketHandle;
RecvThread->Resume(); // 开始执行线程
}
}
catch(...)
{
MessageBoxA(NULL,"出现错误!","系统提示",0 );
if (!RecvThread==NULL)
{
RecvThread->Free();
TotalThreadNum--;
}
return;
}
}
<--Frmmain.h-->
//------------------------------------------------------------------------
#ifndef FrmMainH
#define FrmMainH
//------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
#include <FileCtrl.hpp>
#include <ImgList.hpp>
#include <NMFtp.hpp>
#include <Psock.hpp>
#include <ScktComp.hpp>
#include <ToolWin.hpp>
#include <IniFiles.hpp>
#include <ComCtrls.hpp>
#include <NMFtp.hpp>
#include <Psock.hpp>
#include <ScktComp.hpp>
#include <Dialogs.hpp>
//------------------------------------------------------------------------
class TMain : public TForm
{
__published:// IDE-managed Components
TServerSocket *ServerSocket;
TTimer *Timer1;
TLabel *lblClientNum;
TLabel *Label1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall N3Click(TObject *Sender);
private:// User declarations
bool __fastcall Logo_Oper(void);
bool __fastcall ConnectDataBase();
long packHadle[50];
bool accessRight[50];
AnsiString shutdownkind;
int MaxThreadMaxNum;//最大允许连接数量
protected:
public:// User declarations
int ServerPort;
int TotalThreadNum;//当前连接总数量
AnsiString ServerAddress;
AnsiString DataConnectString;//数据库连接字符串
AnsiString ExeFilePath;//系统所在路径
__fastcall TMain(TComponent* Owner);
};
//------------------------------------------------------------------------
extern PACKAGE TMain *Main;
//------------------------------------------------------------------------
#endif