首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

通过线程接收数据后,为什么界面闪烁,该如何解决

2012-01-14 
通过线程接收数据后,为什么界面闪烁程序采用单文档视图方式,我通过socket方式接收从服务端传来的数据,当我

通过线程接收数据后,为什么界面闪烁
程序采用单文档视图方式,我通过socket方式接收从服务端传来的数据,当我连接服务端的时,通过线程的方法接收数据,每隔1秒接收一次,但是当接收数据时,无法操作菜单项功能,并且屏幕也一闪一闪的,把连接停止后,就不存在这样的问题了,请问大家如何解决呀
下面是我的程序,
void CNetMapView::OnBtnConn() 
{
// TODO: Add your control notification handler code here
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
char ipaddress[35];
//m_edit2.GetWindowText(ipaddress,30);
cli.sin_addr.s_addr=inet_addr("192.168.0.54");
cli.sin_family=AF_INET;
cli.sin_port=htons(5000);//htons(5000);
//创建socket
clisock=socket(AF_INET,SOCK_STREAM,0);
ee=1;
//启动线程
AfxBeginThread(thread,0);

m_btnConn.EnableWindow(FALSE);
m_btnDisConn.EnableWindow(TRUE);
}

//线程
UINT thread(LPVOID v)
{


char buff[100];
char array[2][30]=
{"192.168.1.54",
"192.168.1.54"};
CSize size;
size.cx=0;
size.cy=30;
int s=1,addcount=0;



CMainFrame* pMainFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CNetMapView* pView=(CNetMapView*)pMainFrm->GetActiveView();

//pView->m_btnConn.EnableWindow(m_bLogin);
//pView->m_btnConn.EnableWindow(FALSE);
//pView->m_btnDisConn.EnableWindow(!m_bLogin);
//连接到服务器
while(int i = connect(pView->clisock,(sockaddr*)&(pView->cli),sizeof(pView->cli)) && pView->ee!=0)
{
int nErrorCode = GetLastError();  
//pView->m_edit.SetWindowText("等待.....");
//空循环
for (int i=0;i<=65000;i++)
for(int j=0;j<=200;j++);
if (addcount==25)
addcount=0;
pView->cli.sin_addr.s_addr=inet_addr(array[addcount++]);
}

if (pView->ee==1)
{
//::AfxMessageBox("连接成功");
pView->m_list.InsertItem(0,"连接成功");
pView->m_list.SetItemText(0,1,"conn");
pView->m_list.SetItemText(0,2,"1");
//pView->m_list.InsertItem(pView->count++,"连接成功");
}

//pView->m_btnConn.EnableWindow(m_bLogin);
pView->SetForegroundWindow();

//循环获得数据
while(s!=SOCKET_ERROR && pView->ee!=0)
{
//调用recv函数接收数据
s=recv(pView->clisock,buff,100,0);
pView->SetForegroundWindow();
if (s!=SOCKET_ERROR && pView->ee!=0)
{
//pView->m_list.InsertItem(0,buff);

pView->m_list.InsertItem(0,buff);
pView->m_list.SetItemText(0,1,"指令");
pView->m_list.SetItemText(0,2,"值");
}
pView->m_list.Scroll(size);

//m_list.InsertItem(0,S1);
//m_list.SetItemText(0,1,"属性名");
//m_list.SetItemText(0,2,"属性值");

Sleep(1000);

}
//发送断开命令
send(pView->clisock,"Disconnected",100,0);
//pView->m_btnConn.EnableWindow(m_bLogin);
//pView->m_btnDisConn.EnableWindow(!m_bLogin);
closesocket(pView->clisock);
AfxEndThread(0);
return 0;
}

[解决办法]
SetForegroundWindow();是你闪的原因吧

热点排行