Suokea 2021-01-04 15:57 采纳率: 50%
浏览 75
已采纳

MFC中关于线程退出的问题,正常设计的标志位为什么退不出来?

有两个按钮,一个是连接按钮,控制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条回答 默认 最新

  • Onvejon 2021-01-04 16:26
    关注

    1、你的m_SocketRecv 是阻塞的吗?如果是阻塞的,触非你设置标志位后正好收到m_SocketRecv 的数据。不然线程一直在RecvFrom等待。

    2、这种线程 Loop 很难写的,需要做个 select 或者WaitMultiObject  循环。如果要技术响应,就需要在g_bRunningR 标签设置后,立马发送消息或者事件中断循环中的select 或者WaitMultiObject 才可能及时推出线程。

    3、如果合适的话,推荐使用 libuv。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助