有两个按钮,一个是连接按钮,控制UDP建立的
void Cbeauty3Dlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
int SocketPort;
int LocalPort;
CString TypeNet;
SocketPort = GetDlgItemInt(IDC_EDIT3);
LocalPort = GetDlgItemInt(IDC_EDIT5);
GetDlgItemText(IDC_COMBO5, TypeNet);
if (LinkFlag == 1)
{
LinkFlag = 0;
if (TypeNet == "UDP")
{
if ((SocketPort != 0) && (LocalPort != 0))
{
m_SocketRecv.Create(SocketPort, LocalPort);
m_link.LoadBitmaps(IDB_BITMAP6);
m_link.SizeToContent();
}
}
}
else
{
LinkFlag = 1;
closesocket(m_SocketRecv.m_Socket);
m_link.LoadBitmaps(IDB_BITMAP5);
m_link.SizeToContent();
}
}
一个是进行文件读写的,在这里面写了一个线程,可是退不出来,使得我的按钮上的位图变化不了,不知道是什么原因
下面是关于线程开启与关闭的代码
void Cbeauty3Dlg::OnBnClickedButton8()
{
GetDlgItemText(IDC_EDIT4, str);
if (RecvFlag == 1)
{
RecvFlag = 0;
m_recv.LoadBitmaps(IDB_BITMAP8);
m_recv.SizeToContent();
if (g_pRecvThread == NULL)
{
g_pRecvThread = AfxBeginThread(RecvData, this);
g_bRunningR = TRUE;
}
}
else
{
m_recv.LoadBitmaps(IDB_BITMAP7);
m_recv.SizeToContent();
g_bRunningR = FALSE;
Count = 0;
SetDlgItemInt(IDC_STATIC, Count);
RecvFlag = 1;
}
}
下面是线程函数
UINT RecvData(LPVOID pParam)
{
Cbeauty3Dlg *rethread = (Cbeauty3Dlg *)pParam;
(rethread->Count) = 0;
CFile ReFile(rethread->str, CFile::modeCreate | CFile::modeReadWrite);
int RecvLen;
char buffer[4000];
CWinApp* pWinApp = AfxGetApp();
CWnd *pWnd = pWinApp->GetMainWnd();
while (1)
{
if (!g_bRunningR) break;
RecvLen = m_SocketRecv.RecvFrom(buffer, 4000);
ReFile.Write(buffer, 4000);
if (RecvLen > 0)
{
(rethread->Count)++;
::SetDlgItemInt(pWnd->m_hWnd, IDC_STATIC, rethread->Count, false);
}
}
ReFile.Close();
g_pRecvThread = NULL;
g_bRunningR = FALSE;
return 0;
}
求大神帮帮我吧
1、你的m_SocketRecv 是阻塞的吗?如果是阻塞的,触非你设置标志位后正好收到m_SocketRecv 的数据。不然线程一直在RecvFrom等待。
2、这种线程 Loop 很难写的,需要做个 select 或者WaitMultiObject 循环。如果要技术响应,就需要在g_bRunningR 标签设置后,立马发送消息或者事件中断循环中的select 或者WaitMultiObject 才可能及时推出线程。
3、如果合适的话,推荐使用 libuv。