struct USBDATA1{ char force[16]; char pos[16]; }; bool DataSample;};//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_)[/color] 就是上面那个类啊。我在public里面加变量不可以加了。
还会出现unhandled exception in **.exe(KERNEL32.DLL):0xc0000005:access violation.
#define AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxwin.h>
#include <afxcmn.h>
#include <winsock2.h>
#include <Afxsock.h>
#include <Mmsystem.h>
#include "OScopeCtrl.h"
#include "VideoCapture.h"
#include "Encoder/libr263.h"
#include "Decoder/tmndec.h"#define QCIF_WIDTH 176
#define QCIF_HEIGHT 144#define IMAGE_WIDTH QCIF_WIDTH
#define IMAGE_HEIGHT QCIF_HEIGHT#define InBlocks 4
#define OutBlocks 4
#define INPUT_BUFFER_SIZE 1000 /////////////////////////////////////////////////////////////////////////////
// CClientDlg dialog#pragma comment(lib,"WS2_32.lib")
struct CAdio{
PBYTE lpData;
DWORD dwDataLength;
};
class CClientDlg : public CDialog
{
// Construction
public:
// static UINT RecvWaveThread(LPVOID pParam);
// static UINT SendWaveThread(LPVOID pParam);
long OnVideoSocket(WPARAM wParam, LPARAM lParam);
static UINT ConnectVideoProc (LPVOID lParam);
void SendVideo(BYTE *data, int size);
static UINT Sampling(LPVOID lParam);
u_short GetPort(int pt);
DWORD GetIP();
static UINT ConnectDataProc (LPVOID lParam);
CClientDlg(CWnd* pParent = NULL); // standard constructor
COScopeCtrl m_forcechart;
COScopeCtrl m_poschart;
HANDLE m_hUSBDevice;
SOCKET m_datasocket;
SOCKET m_videosocket;
PBITMAPINFO m_bmpinfo;
CParam cparams;
bool isVideo;
int local_wnd_x , local_wnd_y;
int remote_wnd_x , remote_wnd_y;
HDC m_hdc;
HWND hwnd;
HDRAWDIB hdib;
unsigned char vdata[30000];//存放视频数据
unsigned int yuv[ QCIF_WIDTH*QCIF_HEIGHT + (QCIF_WIDTH*QCIF_HEIGHT)/2 ];
bool m_VideoSample;
VideoCapture *vidcap;[color=#FF00FF][color=#FF00FF]/* int PORT2;
HWAVEIN hWaveIn; //输入设备
HWAVEOUT hWaveOut; //输出设备
PWAVEHDR pWaveHdrIn;//音频头
PWAVEHDR pWaveHdrOut; //输出音频头
WAVEFORMATEX waveFormatOut,waveFormatIn;
PBYTE pbBuffer1,pbBuffer2;//buffer指针
//用于暂时存放要播放的音频和已经录音的音频队列
CAdio InAdio[InBlocks],OutAdio[OutBlocks];
int nAdioIn,nSend,//产生的音频和发送的音频指针
nAdioOut,nRecv;//播放的音频和接收到的音频指针*/[/color]// Dialog Data
//{{AFX_DATA(CClientDlg)
enum { IDD = IDD_CLIENT_DIALOG };
CIPAddressCtrl m_addr;
CString m_dataport;
CString m_videoport;
CString m_localvideo;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CClientDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected:
long OnDataSocket(WPARAM wParam,LPARAM lParam);
HICON m_hIcon; CStatusBarCtrl m_bar;
CWinThread* DThID;
CWinThread* VThID;
// Generated message map functions
//{{AFX_MSG(CClientDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDatasampling();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnDatasend();
afx_msg void OnVideosend();
afx_msg void OnVideosampling();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private: struct USBDATA{
float force;
float pos;
};
struct USBDATA1{
char force[16];
char pos[16];
}; bool DataSample;};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_)[/color]
就是上面那个类啊。我在public里面加变量不可以加了。
unsigned int yuv[ QCIF_WIDTH*QCIF_HEIGHT + (QCIF_WIDTH*QCIF_HEIGHT)/2 ]; // 约152KB
这2个数组太大了,占用了约180KB的内存,这个对象在栈里构造,可能会栈溢出。因为VC里的默认线程栈是1MB,定义几个这样的对象,就溢出了,Access violation.
解决方法:2种,
1.把大数组放在堆里,
CClientDlg(CWnd* pParent = NULL)
{
vdata = new unsigned char[30000];
yuv = new unsigned int [ QCIF_WIDTH*QCIF_HEIGHT + (QCIF_WIDTH*QCIF_HEIGHT)/2 ];
// 其他初始化
}~CClientDlg()
{
delete []vdata;
delete []yuv;
}unsigned char *vdata;
unsigned int *yuv;2. 把栈的提交内存调大些。项目-->属性-->配置属性-->链接器-->系统-->"堆栈保留大小"和“堆栈提交大小”改得大些
其他的情况系统都会自动回收~除非你程序出错没有正常关闭,中途退出,以至程序没能及时回收资源咯