两个窗口之间的通信,你能想到什么

本文介绍了一种通过创建监听事件线程实现组件间通信的方法。A类通过创建线程实时监听B类触发的事件,并更新UI显示。该方案适用于需要实时响应特定事件的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我首先想到发消息,SendMessage也好,PostMessage也好。

还有什么呢,直接加个B类变量作为A的成员变量,之后进行操作。

还有一种方法,就是开个监听事件线程,以A实时响应B的操作为例:

A.h

protected:
 HANDLE m_hListenCorrAnsThread;

 static DWORD WINAPI ListenCorrAnswersThread(LPVOID lParam);
 BOOL   StartThreadListenCorrAnswer();

public:
 static  CEvent  s_evtCorrAnswer;       //用于监视学生答案是否提交
 static  CString s_sCorrAnswer;
 static  int     s_nCorrPercent;

A.cpp

CString A::s_sCorrAnswer  = "";
int     A::s_nCorrPercent = 0;
CEvent  A::s_evtCorrAnswer;

void A::OnInitialUpdate()
{
......

 if (!StartThreadListenCorrAnswer())
 {
  MessageBox("开启正确答案监听线程失败!");
 }
 

 // TODO: Add your specialized code here and/or call the base class
}

 

/******************************************************************
* Function         :开启监听正确答案线程
* Input Parameters :
* Output Parameters:
* Return Value     :
* Created By       :yal 2013.08.29
*******************************************************************/
BOOL A::StartThreadListenCorrAnswer()
{
 LOG(_T("启动客观题统计监听正确答案线程!\n"));

 CWinThread* hThread = ::AfxBeginThread((AFX_THREADPROC)A::ListenCorrAnswersThread, (LPVOID)this);

 m_hListenCorrAnsThread = hThread->m_hThread;

 return (m_hListenCorrAnsThread != NULL);
}
/******************************************************************
* Function         :监听正确答案处理函数
* Input Parameters :
* Output Parameters:
* Return Value     :
* Created By       :yal 2013.08.29
*******************************************************************/
DWORD WINAPI A::ListenCorrAnswersThread(LPVOID lParam)
{
 TRACE(_T("CObjectiveStatisticsView::ListenCorrAnswersThread\n"));
 CObjectiveStatisticsView* pObjectView = (CObjectiveStatisticsView*)lParam;

 while (TRUE)
 {
  if (WAIT_FAILED == ::WaitForSingleObject(s_evtCorrAnswer.m_hObject, INFINITE))
  {
   DWORD dError = ::GetLastError();
   LOG("WaitForSingleObject函数出现错误,错误代码:%d,程序退出", dError);
   return 1;
  }

  if(!s_sCorrAnswer.IsEmpty())
  {
   //得到正确率百分比区域
   CDC* pDc = pObjectView->GetDlgItem(IDC_OBJECTIVE_PERCENTAGE_CORRECT)->GetDC();
   CRect rect;
   pObjectView->GetDlgItem(IDC_OBJECTIVE_PERCENTAGE_CORRECT)->GetClientRect(&rect);
   pObjectView->InvalidateRect(&rect,TRUE);
   pObjectView->UpdateWindow();
   //设置字体
   CFont m_Font;
   m_Font.CreateFont(100,0,0,0,FW_NORMAL,FALSE,FALSE,0,
    ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    DEFAULT_QUALITY,FF_SWISS,"Arial");

   //CFont *pOldFont = (CFont*)pDc->SelectObject(&m_Font);
   pDc->SelectObject(&m_Font);
   pDc->SetTextColor(RGB(94,179,19));
   pDc->SetBkMode(TRANSPARENT);
   //画百分比
   CString sPercent;
   sPercent.Format("%d",s_nCorrPercent);
   if (s_nCorrPercent >= 100)
   {
    pDc->DrawText(sPercent, CRect(2,25,60,128), DT_NOCLIP);
   }
   else if (s_nCorrPercent >= 10)
   {
    pDc->DrawText(sPercent, CRect(25,25,60,128), DT_NOCLIP);
   }
   else
   {
    pDc->DrawText(sPercent, CRect(50,25,60,128), DT_NOCLIP);
   }
  }
 }
 return 0;
}

B.cpp

void B::OnEnKillfocusEditAnswer()
{
 // TODO: Add your control notification handler code here
 SetEvent(A::s_evtCorrAnswer);
}

网络编程之远程屏幕抓取程序,有源码!!直接可用!! #include "StdAfx.h" #include <stdio.h> DWORD WINAPI AnswerThread(LPVOID lparam) { SOCKET ClientSocket=(SOCKET)(LPVOID)lparam; int bytesRecv; char sendbuf[32]=""; char recvbuf[32]=""; while(1) { bytesRecv=SOCKET_ERROR; for(int i=0;i<(int)strlen(recvbuf);i++) { recvbuf[i]=´\0´; } while(bytesRecv==SOCKET_ERROR) { //Receiving Data bytesRecv=recv(ClientSocket,recvbuf,32,0); } //Write your processing code here send(ClientSocket,recvbuf,strlen(recvbuf),0); printf("%s\n",recvbuf); } return 0; } int main(int argc,char* argv[]) { //initialize Winsock WSADATA wsaData; int iRet=WSAStartup(MAKEWORD(2,2),&wsaData); if(iRet!=NO_ERROR) printf("Error at WSAStartup()\n"); //create a socket SOCKET m_socket; m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(m_socket==INVALID_SOCKET) { printf("Error at socket():%ld\n",WSAGetLastError()); WSACleanup(); return 0; } //bind a socket sockaddr_in service; service.sin_family=AF_INET; service.sin_addr.s_addr=inet_addr("172.16.3.250"); service.sin_port=htons(2501); if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR) { printf("bind() failed.\n"); closesocket(m_socket); return 0; } else printf("bind OK.\n"); //listen on a socket if(listen(m_socket,20)==SOCKET_ERROR) printf("Error listening on socket.\n"); else printf("listening ok.\n"); //accept a connection SOCKET AcceptSocket; printf("Waiting for a client to connect...\n"); while(1) { AcceptSocket=SOCKET_ERROR; while(AcceptSocket==SOCKET_ERROR) { AcceptSocket=accept(m_socket,NULL,NULL); } printf("Client Connected.\n"); DWORD dwThreadId; HANDLE hThread; hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)AcceptSocket,0,&dwThreadId); if(hThread==NULL) { printf("CreatThread AnswerThread() failed.\n"); } else { printf("CreateThread OK.\n"); } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值