VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 288|回复: 0

VC++高级班之多线程篇-[5]线程间通信

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-28 10:13:04 | 显示全部楼层 |阅读模式
①、最常用的方式:全局变量或者多个线程都能看到的一个东东
1、全局变量方式;
  1. int g_Num = 100;
  2. UINT __cdecl ThreadWriteProc(LPVOID lpParameter)
  3. {
  4.         while(TRUE) {
  5.                 ++g_Num;
  6.                 Sleep(50);
  7.         }
  8.         return 100;
  9. }

  10. UINT __cdecl ThreadReadProc(LPVOID lpParameter)
  11. {
  12.         CString strTipMsg;
  13.         while(TRUE) {
  14.                 strTipMsg.Format(_T("%d"), g_Num);
  15.                 OutputDebugString(strTipMsg);
  16.                 Sleep(50);
  17.         }

  18.         return 100;
  19. }

  20. void CThreadTestDlg::OnBnClickedBtn()
  21. {
  22.         CWinThread *pThread = AfxBeginThread(ThreadWriteProc, NULL);
  23.         AfxBeginThread(ThreadReadProc, NULL);
  24. }
复制代码


2、大家都能访问到的一个东东;
3、全局变量的声明方式;
===================================================
②、发消息方式:PostThreadMessage

  1. #define MY_THREAD_MSG (WM_USER+100)
  2. UINT __cdecl ThreadWriteProc(LPVOID lpParameter)
  3. {
  4.         int nCount = 0;
  5.         DWORD dwThreadReadID = (DWORD)lpParameter;
  6.         while(TRUE) {
  7.                 PostThreadMessage(dwThreadReadID, MY_THREAD_MSG, nCount++, NULL);
  8.                 Sleep(50);
  9.         }
  10.         return 0;
  11. }

  12. UINT __cdecl ThreadPrintProc(LPVOID lpParameter)
  13. {
  14.         MSG msg = {0};
  15.         while(GetMessage(&msg, 0, 0, 0))
  16.         {
  17.                 switch(msg.message) {
  18.                         case MY_THREAD_MSG:
  19.                                 {
  20.                                         int nCount = (int)msg.wParam;
  21.                                         CString strText;
  22.                                         strText.Format(_T("%d"), nCount);
  23.                                         OutputDebugString(strText);
  24.                                 }
  25.                                 break;
  26.                 }
  27.         }

  28.         return 0;
  29. }

  30. void CThreadTestDlg::OnBnClickedBtn()
  31. {
  32.         CWinThread *pThreadPrint = AfxBeginThread(ThreadPrintProc, NULL);
  33.         CWinThread *pThreadWrite = AfxBeginThread(ThreadWriteProc, (LPVOID)pThreadPrint->m_nThreadID);
  34. }
复制代码

===================================================
③、与界面线程方面的联系!
1、创建界面线程的返回值 CWinThread 类型指针,就是新线程的指针;
2、在新界面线程中调用 AfxGetApp(); 获取到的是程序主线程的指针;

通过以上两种方法中的任意一种,将指针进行强制类型转换之后,可以轻松的实现线程间的通信!

3、对于 PostThreadMessage 方式的通信,界面线程同样适用,重载界面线程类的 PreTranslateMessage 即可!
===================================================
※※※ 小作业:动手实践吧,本节课的知识点一定要深入理解,灵活运用!
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
VC驿站Vip会员售后答疑截图【持续更新】:https://www.cctry.com/thread-288054-1-1.html
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html





上一篇:VC++高级班之多线程篇-[4]线程的相关操作
下一篇:VC++高级班之网络编程篇-[1]网络编程概述

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 22:55

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表