windows下线程间的通信方式

1.事件:

(在信息交换函数中将控件的值与控件id进行绑定,这样我们就可以更新或者获取控件的值)

1 void CMy0722ThreadTalkingDlg::DoDataExchange(CDataExchange* pDX)
2 {
3     CDialogEx::DoDataExchange(pDX);
4     DDX_Radio(pDX, IDC_RADIO1, m_radio);
5     DDX_Control(pDX, IDC_COMBO1, m_test);
6 }
  1 void CMy0722ThreadTalkingDlg::OnBnClickedButton1()
  2 {
  3       4     //创建线程
  5     if(!m_hThread)
  6     {
  7         m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//在线程创建之前创建事件
  8         //安全属性,(重置事件)人工为true,信号(false对应为无信号),事件名字(跨进程时可以使用));
  9         m_hThread = (HANDLE)_beginthreadex(NULL,0,&CMy0722ThreadTalkingDlg::ThreadProc,this,0,NULL);
 10
 11     }
 12
 13 }
 14
 15  unsigned _stdcall CMy0722ThreadTalkingDlg::ThreadProc( void *  lpvoid)
 16  {
 17      CMy0722ThreadTalkingDlg *pthis = ( CMy0722ThreadTalkingDlg *)lpvoid;
 18      CString str;
 19      while(pthis->m_bFlagQuit)
 20      {
 21          //等事件
 22          if(WAIT_TIMEOUT ==  WaitForSingleObject(pthis->m_hEvent,100))
 23          {
 24              continue;
 25          }
 26          int nSum = 0;
 27          for(int i = 1;i <= pthis->m_nCalc;i++)
 28          {
 29              nSum+= i;
 30          }
 31
 32         //第一种方式:事件 35          str.Format(_T("%d"),nSum);
 36          pthis->GetDlgItem(IDC_EDIT1)->SetWindowText(str);
 38
 39      }
 40      return 0;
 41  }
 42
 53 void CMy0722ThreadTalkingDlg::OnBnClickedButton2()
 54 {
 55     56     //计算
 57 //    m_radio = 1;
 58     //UpdateData( FALSE); //初始化对话框数据
 59     //获得要计算的值
 60     UpdateData(TRUE);  //从对话框上获得数据
 61     switch (m_radio)//此处用了组控件,但m_radio与tab键编号多少无关,仅是一句tab键的顺序从0开始编号(如tab键我们设置为123...,但m_radio的值仍是从0开始)
 62     {
 63     case 0:
 64         m_nCalc = 10;
 65         break;
 66     case 1:
 67         m_nCalc = 100;
 68         break;
 69     case 2:
 70         m_nCalc = 1000;
 71         break;
 72     default:
 73         break;
 74     }
 75
 76
 77     //将事件置为有信号
 78     SetEvent(m_hEvent);//先拿到值再将事件置为有信号
 79
 80 }
 81
 82
 83 void CMy0722ThreadTalkingDlg::OnDestroy()
 84 {
 85     CDialogEx::OnDestroy();
 86
 87     // TODO: 在此处添加消息处理程序代码
 88     m_bFlagQuit = false;
 89
 90     if(m_hThread)
 91     {
 92         if(WAIT_TIMEOUT == WaitForSingleObject(m_hThread,100))
 93         {
 94             TerminateThread(m_hThread,-1);
 95         }
 96         CloseHandle(m_hThread);
 97         m_hThread = NULL;
 98
 99     }
100
101     if(m_hEvent)
102     {
103         CloseHandle(m_hEvent);
104         m_hEvent = NULL;
105     }
106 }

2.消息

  1 void CMy0722ThreadTalkingDlg::OnBnClickedButton1()
  2 {
  3     // TODO: 在此添加控件通知处理程序代码
  4     //创建线程
  5     if(!m_hThread)
  6     {
  7         m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//在线程创建之前创建事件
  8         //安全属性,(重置事件)人工为true,信号,名字);
  9         m_hThread = (HANDLE)_beginthreadex(NULL,0,&CMy0722ThreadTalkingDlg::ThreadProc,this,0,NULL);
 10
 11     }
 12
 13 }
 14
 15  unsigned _stdcall CMy0722ThreadTalkingDlg::ThreadProc( void *  lpvoid)
 16  {
 17      CMy0722ThreadTalkingDlg *pthis = ( CMy0722ThreadTalkingDlg *)lpvoid;
 18      CString str;
 19      while(pthis->m_bFlagQuit)
 20      {
 21          //等事件
 22          if(WAIT_TIMEOUT ==  WaitForSingleObject(pthis->m_hEvent,100))
 23          {
 24              continue;
 25          }
 26          int nSum = 0;
 27          for(int i = 1;i <= pthis->m_nCalc;i++)
 28          {
 29              nSum+= i;
 30          }
 31
 32          //第二种方式 消息--- 显示主窗口
 33          pthis->PostMessage(UM_MSG,nSum,0);
 34
 38
 39      }
 40      return 0;
 41  }
 42
 43  LRESULT CMy0722ThreadTalkingDlg::OnMsg(WPARAM  wparam,LPARAM lparam)
 44  {
 45     CString str;
 46     str.Format(_T("%d"),wparam);
 47
 48     GetDlgItem(IDC_EDIT1)->SetWindowText(str);
 49     //while(1);
 50      return 0;
 51  }
 52
 53 void CMy0722ThreadTalkingDlg::OnBnClickedButton2()
 54 {
 55     // TODO: 在此添加控件通知处理程序代码
 56     //计算
 57 //    m_radio = 1;
 58     //UpdateData( FALSE); //初始化对话框数据
 59     //获得要计算的值
 60     UpdateData(TRUE);  //从对话框上获得数据
 61     switch (m_radio)
 62     {
 63     case 0:
 64         m_nCalc = 10;
 65         break;
 66     case 1:
 67         m_nCalc = 100;
 68         break;
 69     case 2:
 70         m_nCalc = 1000;
 71         break;
 72     default:
 73         break;
 74     }
 75
 76
 77     //将事件置为有信号
 78     SetEvent(m_hEvent);//先拿到值再将事件置为有信号
 79
 80 }
 81
 82
 83 void CMy0722ThreadTalkingDlg::OnDestroy()
 84 {
 85     CDialogEx::OnDestroy();
 86
 87     // TODO: 在此处添加消息处理程序代码
 88     m_bFlagQuit = false;
 89
 90     if(m_hThread)
 91     {
 92         if(WAIT_TIMEOUT == WaitForSingleObject(m_hThread,100))
 93         {
 94             TerminateThread(m_hThread,-1);
 95         }
 96         CloseHandle(m_hThread);
 97         m_hThread = NULL;
 98
 99     }
100
101     if(m_hEvent)
102     {
103         CloseHandle(m_hEvent);
104         m_hEvent = NULL;
105     }
106 }

https://www.cnblogs.com/itech/archive/2010/06/29/1767311.html

原文地址:https://www.cnblogs.com/curo0119/p/8352922.html

时间: 2024-11-13 06:49:28

windows下线程间的通信方式的相关文章

进程与线程间的通信方式

一.进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. # 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

windows下线程创建

windows下线程创建: CreateThread()函数是Windows提供的API接口 1.HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId ); 函数说明: 第一个参数表示

线程间的通信方式以及线程与进程的区别

1.锁机制     1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法.     1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥.     1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止.对条件测试是在互斥锁的保护下进行的.条件变量始终与互斥锁一起使用.2.信号量机制:包括无名线程信号量与有名线程信号量3.信号机制:类似于进程间的信号处理.线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制. 进程和线程的区别?定义:进程

windows下线程库的使用

下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)   http://sourceware.org/pthreads-win32/ ,解压到一个目录. 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. 2.添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录.         然后添加

一个Windows下线程池的实现(C++)

前言 本文配套代码:https://github.com/TTGuoying/ThreadPool 先看看几个概念: 线程:进程中负责执行的执行单元.一个进程中至少有一个线程. 多线程:一个进程中有多个线程同时运行,根据cpu切换轮流工作,在多核cpu上可以几个线程同时在不同的核心上同时运行. 线程池:基本思想还是一种对象池思想,开辟一块内存空间,里面存放一些休眠(挂起Suspend)的线程.当有任务要执行时,从池中取一个空闲的线程执行任务,执行完成后线程休眠放回池中.这样可以避免反复创建线程对

java线程间的通信方式

1.同步 synchronized 2.轮询 while   volatile 3.wait/notify机制 syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll() ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll() 4.管道通信 使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信 通过管道,将一个线程中的消息发

进程间,线程间通信方式

一.进程间的通信方式 1 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.2 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.3 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.

线程间的通信、同步方式与进程间通信方式

1.线程间的通信方式 1)使用全局变量(由于多个线程可能更改全局变量,因此全局变量最好声明为volatile) 2) 使用消息实现通信 3)使用事件CEvent类实现线程间的通信 2.同步/异步(C端) 同步:在C端发出一个功能调用时,没有得到结果之前就不返回 异步: 一个请求通过事件触发后,得到服务器处理后才处理完毕 3. 阻塞/非阻塞(S端) 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行).函数只有在得到