zoukankan      html  css  js  c++  java
  • 利用消息循环的多线程通讯c++

    程序实现的要求:

    我的程序中有一个主线程,N个工作线程。主线程负责收集数据,然后分派给不同的工作线程去处理。我在程序中使用了PostThreadMessage()来通知相应的线程处理数据,而工作线程使用GetMessage()来进行相应。

    伪代码:

    代码流程如下:  
      CreateThread(main);//主线程;  
      for   (int   i=0;i<10;i++)//假设10个工作线程  
      {  
            CreateThread(work);   //这里同时记录工作线程的ThreadID;    
      }  
      ThreadMain()  
      {  
              if   (条件符合某个线程的要求)  
              {  
                  while(!PostThreadMessage(WorkID,MSG,parm,0))   sleep(0);//投递消息通知给相应的工作线程  
              }  
      }  
      ThreadWork()  
      {  
              while(true)  
              {  
                    iRet   =   GetMessage(msg,NULL,0,0);  
                    {  
                        ......此处省略对iRet的判断  
                        if   (msg.message   =   MY_MSG)  
                        {  
                                进行相应处理。。。  
                        }  
                    }  
              }  
      }  

    编译通过的源代码:

    //---------------------------------------------------------------------------  
      #include   <vcl.h>  
      #pragma   hdrstop  
      #include   <map>  
      #include   <iostream>  
      using   namespace   std;  
      typedef   map<int,DWORD>   value_map;  
      typedef   value_map::value_type   valType;  
      #define   WM_WORK   WM_APP   +   0x100  
      #define   WM_FINISH   WM_APP   +   0x101  
      value_map   *vThreadsIdles;  
      //---------------------------------------------------------------------------  
      #pragma   argsused  
      DWORD   WINAPI   ThreadMain(LPVOID   p);  
      DWORD   WINAPI   ThreadWork(LPVOID   p);  
      HANDLE   hMutex;  
      int   main(int   argc,   char*   argv[])  
      {  
                      value_map   mThreads;  
                      HANDLE   handle;  
                      DWORD   dw;  
                      hMutex   =   CreateMutex(NULL,false,"Sample");  
                      for   (int   iThreadIndex   =   0;   iThreadIndex   <   10;   ++iThreadIndex)  
                      {  
                                      handle   =   CreateThread(NULL,0,ThreadWork,NULL,0,&dw);  
                                      mThreads.insert(valType(iThreadIndex,dw));  
                      }  
                      //主线程;  
                      handle   =   CreateThread(NULL,0,ThreadMain,(LPVOID)&mThreads,0,&dw);  
                      WaitForSingleObject(handle,INFINITE);  
                      CloseHandle(handle);  
                      CloseHandle(hMutex);  
                      return   0;  
      }  
      //---------------------------------------------------------------------------  
      DWORD   WINAPI   ThreadMain(LPVOID   p)  
      {  
                      TDateTime   dtNow;  
                      vThreadsIdles   =   (value_map   *)p;  
                      int   iSecond;  
                      MSG   msg;  
                      int   iRet;  
                      bool   blPostTM;  
                      value_map::iterator   iter;  
                      cout   <<   "Start"   <<   endl;  
                      DWORD   dThread;  
                      int   iID;  
                      while(true)  
                      {  
                                      dtNow   =   Date().CurrentDateTime();  
                                      //当前时间秒数小于30时执行  
                                      if(dtNow.FormatString("ss").ToInt()   <   30)  
                                      {  
                                                      iSecond   =   1000;  
                                                      //得到可用处理线程  
                                                      try  
                                                      {  
                                                                    WaitForSingleObject(hMutex,INFINITE);  
                                                                    if(   0   ==   vThreadsIdles->size())  
                                                                    {  
                                                                              continue;  
                                                                    }  
                                                                    //MAP中是后进先出  
                                                                    iter   =   vThreadsIdles->end();  
                                                                    --iter;  
                                                                    dThread   =     (*iter).second;  
                                                                    iID   =   (*iter).first;  
                                                                    vThreadsIdles->erase(iID);  
                                                      }  
                                                      __finally  
                                                      {  
                                                                      ReleaseMutex(hMutex);  
                                                      }  
                                                      //投递消息  
                                                      while(!(blPostTM   =   PostThreadMessage(dThread,WM_WORK,iID,0)))  
                                                      {  
                                                                      //投递超时条件  
                                                                      if(iSecond   ==   3000)  
                                                                      {  
                                                                                      break;  
                                                                      }  
                                                                      Sleep(iSecond);  
                                                                      iSecond   +=   1000;  
                                                      }  
                                                      if(!blPostTM)  
                                                      {  
                                                                      //投递失败线程重回空闲池  
                                                                      WaitForSingleObject(hMutex,INFINITE);  
                                                                      vThreadsIdles->insert(valType(iID,dThread));  
                                                                      ReleaseMutex(hMutex);  
                                                                      cout   <<   AnsiString(dThread).c_str()   <<   "消息投递失败"   <<   endl;  
                                                                      continue;  
                                                      }  
                                                      cout   <<   AnsiString(dThread).c_str()   <<   "消息投递成功"   <<   endl;  
                                      }  
                      }  
      }  
      DWORD   WINAPI   ThreadWork(LPVOID   p)  
      {  
                      MSG   msg;  
                      int   iRet;  
                      int   iSecond;  
                      bool   blPostTM;  
                      while(true)  
                      {  
                                      iRet   =   GetMessage(&msg,NULL,0,0);  
                                      if(WM_WORK   ==   msg.message)  
                                      {  
                                                cout   <<   AnsiString(GetCurrentThreadId()).c_str()   <<   "正在处理...."   <<   endl;  
                                                Sleep(5000);  
                                                //处理完成线程重回空闲池  
                                                WaitForSingleObject(hMutex,INFINITE);  
                                                vThreadsIdles->insert(valType(msg.wParam,GetCurrentThreadId()));  
                                                ReleaseMutex(hMutex);  
                                                cout   <<   AnsiString(GetCurrentThreadId()).c_str()   <<   "空闲"   <<   endl;  
                                      }  
                      }  
      }

  • 相关阅读:
    leetcode231 2的幂 leetcode342 4的幂 leetcode326 3的幂
    leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence
    leetcode64. Minimum Path Sum
    leetcode 20 括号匹配
    算法题待做
    leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown 、714. Best Time to Buy and Sell Stock with Transaction Fee
    rand7生成rand10,rand1生成rand6,rand2生成rand5(包含了rand2生成rand3)
    依图
    leetcode 1.Two Sum 、167. Two Sum II
    从分类,排序,top-k多个方面对推荐算法稳定性的评价
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668279.html
Copyright © 2011-2022 走看看