MFC 打开接受屏幕窗口就卡死,是资源没有释放吗? 求解惑
我写了一个传输屏幕的程序,被控端发送屏幕信息到主控端进行显示然而主控端一打开接受窗口就卡死,就不动了关闭这个窗口主窗口也会被关掉。另外如果我只传输一帧数据是可以正常接受的...
我写了一个传输屏幕的程序, 被控端发送屏幕信息到主控端进行显示
然而主控端一打开接受窗口就卡死,就不动了 关闭这个窗口 主窗口也会被关掉。
另外如果我只传输一帧数据是可以正常接受的
下面是主要代码 求大神指教
void CScreenDlg::GetScreen()
{
MsgHead MsgSend;
MsgSend.dwCmd = CMD_GETFIRST_SCREEN;
MsgSend.dwSize = 0;
if(!SendMsg(m_MainSocket, NULL, &MsgSend))//发出请求屏幕传输的要求
{
::MessageBox(NULL, "屏幕传输请求失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
//以下为屏幕的获取, 一直获取并显示 直到接收不到
while(1)
{
MsgHead MsgRecv;
if(!RecvData(m_MainSocket, (char *)&MsgRecv, sizeof(MsgHead)))
{
::MessageBox(NULL, "屏幕数据接收,命令接收失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
bmfHdr.bfType = 0x4D42; // "BM" // 设置位图文件头
bmfHdr.bfSize = MsgRecv.dwExtend1;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = MsgRecv.dwExtend2;
if(!RecvData(m_MainSocket,(char *)pData,MsgRecv.dwSize))//pdata 全局变量 退出时释放
{
::MessageBox(NULL, "屏幕数据接收,数据接收失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
Invalidate(TRUE);
}
}
void CScreenDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
//双缓存防止闪烁
CWnd* hwnd = GetDlgItem(IDC_PIC);
HDC hDesDC = hwnd->GetDC()->m_hDC;
HDC hSrcDC = CreateCompatibleDC(hDesDC);
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), strFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(hBitmap, sizeof(BITMAP), &bm);
SelectObject(hSrcDC, hBitmap);
CRect rect;
hwnd->GetClientRect(&rect);
BitBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, SRCCOPY);
} 展开
然而主控端一打开接受窗口就卡死,就不动了 关闭这个窗口 主窗口也会被关掉。
另外如果我只传输一帧数据是可以正常接受的
下面是主要代码 求大神指教
void CScreenDlg::GetScreen()
{
MsgHead MsgSend;
MsgSend.dwCmd = CMD_GETFIRST_SCREEN;
MsgSend.dwSize = 0;
if(!SendMsg(m_MainSocket, NULL, &MsgSend))//发出请求屏幕传输的要求
{
::MessageBox(NULL, "屏幕传输请求失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
//以下为屏幕的获取, 一直获取并显示 直到接收不到
while(1)
{
MsgHead MsgRecv;
if(!RecvData(m_MainSocket, (char *)&MsgRecv, sizeof(MsgHead)))
{
::MessageBox(NULL, "屏幕数据接收,命令接收失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
bmfHdr.bfType = 0x4D42; // "BM" // 设置位图文件头
bmfHdr.bfSize = MsgRecv.dwExtend1;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = MsgRecv.dwExtend2;
if(!RecvData(m_MainSocket,(char *)pData,MsgRecv.dwSize))//pdata 全局变量 退出时释放
{
::MessageBox(NULL, "屏幕数据接收,数据接收失败", "出错", MB_OK);
closesocket(m_MainSocket);
return ;
}
Invalidate(TRUE);
}
}
void CScreenDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
//双缓存防止闪烁
CWnd* hwnd = GetDlgItem(IDC_PIC);
HDC hDesDC = hwnd->GetDC()->m_hDC;
HDC hSrcDC = CreateCompatibleDC(hDesDC);
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), strFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(hBitmap, sizeof(BITMAP), &bm);
SelectObject(hSrcDC, hBitmap);
CRect rect;
hwnd->GetClientRect(&rect);
BitBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, SRCCOPY);
} 展开
展开全部
用了while(1)当然卡死了,建议任何情况下都不要用直接while(1),否则会占慢一个CPU核心,如果实在需要while(1),那么务必在里面加上一句Sleep让它休息“一会儿”,这个休息时间对人来说可能看不出区别,但是对电脑来说则是大大降低了负载。
建议在内部while(1)加Sleep(10);也就是10毫秒执行一次
建议在内部while(1)加Sleep(10);也就是10毫秒执行一次
更多追问追答
追问
你好 我把while(1)循环内的所有语句都注释掉后,然后加上Sleep(1000*30); 100 1000 1000 * 10 这些都试过了 只要打开子窗口就死掉 求解释
追答
就用Sleep(10),数字太大也要卡死,1000*30就是卡30秒
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询