1. 程式人生 > >PeekMessage、WaitForSingleObject、PostThreadMessage多執行緒使用示例

PeekMessage、WaitForSingleObject、PostThreadMessage多執行緒使用示例

#include <windows.h>
#include <cstdio>
#include <process.h>
#define MY_MSG WM_USER+100
const int MAX_INFO_SIZE = 20;
HANDLE hStartEvent; // thread start event
// thread function
unsigned __stdcall fun(void *param)
{
 printf("thread fun start\n");
 MSG msg;
 PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
 if(!SetEvent(hStartEvent)) //set thread start event 
 {
  printf("set start event failed,errno:%d/n",::GetLastError());
  return 1;
 }
 printf("新執行緒已經啟動正等待接收資料\r\n");
 while(true)
 {
  if(GetMessage(&msg,0,0,0)) //get msg from message queue
  {
   switch(msg.message)
   {
   case MY_MSG:
    char * pInfo = (char *)msg.wParam;
    printf("recv %s\r\n",pInfo);
    delete[] pInfo;
    break;
   }
  }
 };
 return 0;
}
int main()
{
 HANDLE hThread,hThread1;
 unsigned nThreadID,nThreadID1;
 hStartEvent = ::CreateEvent(0,FALSE,FALSE,0); //create thread start event
 if(hStartEvent == 0)
 {
  printf("create start event failed,errno:%d\r\n",::GetLastError());
  return 1;
 }
 //start thread
 hThread = (HANDLE)_beginthreadex( NULL, 0, &fun, NULL, 0, &nThreadID );
 if(hThread == 0)
 {
  printf("start thread failed,errno:%d/n",::GetLastError());
  CloseHandle(hStartEvent);
  return 1;
 }
 printf("啟動了新執行緒\r\n");
 //wait thread start event to avoid PostThreadMessage return errno:1444
 ::WaitForSingleObject(hStartEvent,INFINITE);
 CloseHandle(hStartEvent);
 ::Sleep(1000);
 int count = 0;
 while(true)
 {
  char* pInfo = new char[MAX_INFO_SIZE]; //create dynamic msg
  sprintf(pInfo,"msg_%d",++count);
  if(!PostThreadMessage(nThreadID,MY_MSG,(WPARAM)pInfo,0))//post thread msg
  {
   printf("post message failed,errno:%d\r\n",::GetLastError());
   delete[] pInfo;
  }
  ::Sleep(1000);
 }
 CloseHandle(hThread);
 return 0;
}

相關推薦

PeekMessageWaitForSingleObjectPostThreadMessage執行使用示例

#include <windows.h> #include <cstdio> #include <process.h> #define MY_MSG WM_USER+100 const int MAX_INFO_SIZE = 20; HA

[原創]一款小巧靈活的Java執行爬蟲框架(AiPa)

1.作品簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB的jar包。 下載該Jar包匯入到你的專案中

AiPa — 小巧靈活的 Java 執行爬蟲框架

1.框架簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB

IOS網路執行shareSDK-使用EDG執行技術下載圖片

使用EDG中央排程多執行緒技術實現圖片的非同步下載 // //  ViewController.swift //  Dome2test // //  Created by 郭文亮 on 2018/11

【本人禿頂程式設計師】你分得清分散式高併發與執行嗎?

←←←←←←←←←←←← 快,點關注! 當提起這三個詞的時候,是不是很多人都認為分散式=高併發=多執行緒? 當面試官問到高併發系統可以採用哪些手段來解決,或者被問到分散式系統如何解決一致性的問題,是不是一臉懵逼? 確實,在一開始接觸的時候,不少人都會將三者混淆,誤以為所謂的分散式

併發並行高併發和執行

1.併發和並行的區別   併發:當有多個執行緒在操作時,如果系統只有一個CPU,把CPU執行時間劃分成若干個時間段,分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀態。這種方式我們稱之為併發(Concurrent)。併發=間隔發生 並行:當系

如何分清分散式高併發與執行嗎?

當提起這三個詞的時候,是不是很多人都認為分散式=高併發=多執行緒? 當面試官問到高併發系統可以採用哪些手段來解決,或者被問到分散式系統如何解決一致性的問題,是不是一臉懵逼?   確實,在一開始接觸的時候,不少人都會將三者混淆,誤以為所謂的分散式高併發的

C++11 併發程式設計基礎(一):併發並行與C++執行

正文 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。另外,併發程式設計可提高應用的效能,這對對效能錙銖必較的C++程式設計師來說是值得關注的。 回到頂部 1. 何為併發 併發指的是兩個或多個獨立的活動在同

qt匯出操作excel(執行

使用QAxObject在多執行緒下進行excel操作,將原來固定格式的文字檔案,通過解析之後寫入到excel中。 效果圖 多執行緒使用 Worker *pWorker = new Worker(); connect(pWorker, SIGNAL(err

42併發程式設計之執行理論篇

### 一 什麼是執行緒 在傳統作業系統中,每個程序有一個地址空間,而且預設就有一個控制執行緒 執行緒顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個程序 車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線 流水線的工作需要電源,電源就相當於

43併發程式設計之執行實操篇

### 一 threading模組介紹 multiprocessing模組完全模仿了threading模組的介面,二者在使用層面,有很大的相似性,因而不再詳細介紹 [官網連結:https://docs.python.org/3/library/threading.html?highlight=thread

簡單執行示例

#include<Windows.h> #include<iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter);//定義執行緒入口函式(規定格式) DWORD WINAP

【Arduino】一份簡單的(偽)執行示例 - print "Hello World" 和 echo 功能

Arduino 上執行(偽)多執行緒示例 - print “Hello World” 和 echo 功能 Arduino 上執行(偽)多執行緒示例 - print "Hello World" 和 echo 功能 Demo Note

有返回值的執行示例

問題場景 近期遇到用多執行緒優化程式,但是必須帶有返回值,實現Runnable介面不可行,檢視API,可以用Callable介面,試舉一例。 package thread; import java

執行示例模仿

public class Test {public static void main(String[] args) {ThreadT tt = new ThreadT();Thread t1 = new Thread(tt, "t1");Thread t2 = new Th

Java執行示例:4個售票員賣1000張火車票

//售票員 import java.util.Iterator; import java.util.Map; public class TicketSaler implements Runnable { private Map<String, Boolean&g

java執行物件鎖類鎖同步機制詳解

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

Python執行程序和協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

執行2-synchronizedlock

1、什麼時候會出現執行緒安全問題?   在多執行緒程式設計中,可能出現多個執行緒同時訪問同一個資源,可以是:變數、物件、檔案、資料庫表等。此時就存在一個問題:   每個執行緒執行過程是不可控的,可能導致最終結果與實際期望結果不一致或者直接導致程式出錯。   如我們在第一篇部落格中出現的count--的問

Linux執行程式設計---執行間同步(互斥鎖條件變數訊號量和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導