C++簡單多執行緒事件驅動同步通知到主執行緒
#include <iostream> #include <assert.h> #include <queue> #include <string> #include <Windows.h> #include <process.h> typedef int s32; typedef unsigned u32; typedef float f32; class LockObject { public: LockObject() { InitializeCriticalSection(&mLock); } ~LockObject() { DeleteCriticalSection(&mLock); } void Lock() { EnterCriticalSection(&mLock); } void UnLock() { LeaveCriticalSection(&mLock); } bool TryLock() { return TryEnterCriticalSection(&mLock); } private: LockObject(const LockObject &other) {} LockObject& operator = (const LockObject &other) {} private: CRITICAL_SECTION mLock; }; class ScopeLock { public: ScopeLock(CRITICAL_SECTION &lock) :mlock(lock) { EnterCriticalSection(&mlock); } ScopeLock(LockObject &lock) :mlock( reinterpret_cast<CRITICAL_SECTION&>(lock) ) { EnterCriticalSection(&mlock); } ~ScopeLock() { LeaveCriticalSection(&mlock); } private: ScopeLock( const ScopeLock &other) :mlock(other.mlock) {} ScopeLock& operator = (const ScopeLock &other) {} private: CRITICAL_SECTION &mlock; }; //簡單模擬多執行緒事件驅動,同步通知到主執行緒 class SimpleEventDriver { public: void DrivingEvents( f32 delta ) { ScopeLock Lock( mLockEvents ); if( mEvents.empty() ) { return; } const auto &evt = mEvents.front(); //這裡應該呼叫註冊函式,未完待續 printf( "%s\n", evt.mInfo.c_str() ); mEvents.pop(); } void OnNotifyEvent( const std::string &info ) { Event evt; evt.mInfo = info; ScopeLock Lock( mLockEvents ); mEvents.push( evt ); } private: struct Event { std::string mInfo; }; std::queue< Event > mEvents; LockObject mLockEvents; }; SimpleEventDriver g_EventDriver; class Test { public: void DoSomeThing1() { g_EventDriver.OnNotifyEvent( "DoSomeThing1 was called." ); } void DoSomeThing2() { g_EventDriver.OnNotifyEvent( "ready to begin thread." ); _beginthreadex( nullptr, 0, Thread, nullptr, 0, nullptr ); } private: static u32 WINAPI Thread( LPVOID p ) { while( true ) { g_EventDriver.OnNotifyEvent( "thread sleep 1000 ms." ); Sleep( 1000 ); } return 0; } }; s32 main() { Test c; c.DoSomeThing1(); c.DoSomeThing2(); //主執行緒迴圈 u32 delta = 0; u32 last = GetTickCount(); while( true ) { delta = GetTickCount() - last; g_EventDriver.DrivingEvents( delta / 1000.0f ); Sleep( 8 ); last = GetTickCount(); } return 0; }
相關推薦
C++簡單多執行緒事件驅動同步通知到主執行緒
#include <iostream> #include <assert.h> #include <queue> #include <string> #include <Windows.h> #include &l
事件驅動框架EventNext之執行緒容器
EventNext是.net core下的一個事件驅動的應用框架,通過它代理建立的介面行為都是通過事件驅動的模式進行呼叫.由於EventNext的所有呼叫都是基於事件佇列來進行,所以在資源控制上非常方便;它可以進行多樣性的執行緒分配,其中Actor應用就是它的一種基礎實現;在新的版中EventNext增加了一
C# 將NamedPipeClientStream封裝為事件驅動的元件
本封裝的元件,可以方便連線本機或遠端 主機的命名管道。 連線遠端主機時,需要提供帳號和密碼。 同時解決了委託事件中修改介面元素時引起的安全錯誤。 程式碼為【除錯】版,有不少除錯資訊傳遞到呼叫者。 using System; using System.ComponentModel;
Delphi7 從子執行緒中傳送訊息到主執行緒觸發事件執行
在對資料庫的操作時,有時要用一個子執行緒來進行後臺的資料操作。比如說資料備份,轉檔什麼的。在主視窗還能同是進行其它操作。而有時後臺每處理一個數據檔案,要向主視窗傳送訊息,讓主視窗實時顯示處理進度在視窗上(可視),同時進行日誌處理等。我用的是下面的方法:[1]用到的API函式:
objective-c 等待多個非同步函式完成後,再執行某段程式碼--GCD Group 的使用
有個 API 如下: + (void)updateByUser:(ALUser *)user completion:(void (^)(void))completion { AVQuery *query = [AVQuery queryWithClassNam
正確實現子執行緒任務全部完成後主執行緒關閉的四種方法
方法一 Thread.sleep 方法二 ExecutorService 方法三 thread.join 方法四 Thread.yield and Thread.
ThreadPool執行緒池使用及解決主執行緒和子執行緒執行順序問題
執行緒池建立五個執行緒,每個執行緒往list中新增100個元素。synchronized只鎖執行緒共享變數list物件,程式碼段內僅新增元素及列印資訊。設定10ms睡眠時間給其餘執行緒機會。 ExecutorService fixedThreadPool = Execut
java學習筆記——spring之aop、切面類中五種通知的使用、存在多個切面類時切面通知的執行順序、註釋的方式定義切面類與通知、xml配置的方式定義切面類與通知
3、AOP AOP:(Aspect Oriented Programming)面向切面程式設計; OOP:(Object Oriented Programming )面向物件程式設計; 面向切面程式設計:基於OOP基礎之上新的程式設計思想; 指在程式執行期間,
Java執行緒池ExecutorService時讓主執行緒等待子執行緒完成後繼續處理
(() -> { try { System.out.println(finalI + " 我執行了。。。"); Thread.sleep(5000L);
子執行緒迴圈10次,緊接著主執行緒迴圈100次,來回50次
package cn.test.thread; /* * 子執行緒10次,主執行緒100次,來回50次 */ public class ThreadTest1 { public static void main(String[] args) throws Inte
AndroidStudio 子執行緒通知主執行緒Demo
import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AppCompatActivity; import a
Handler一定要在主執行緒跑?和脫離主執行緒及HandlerThread的 疑惑
Handler一定要在主執行緒例項化嗎?new Handler()和new Handler(Looper.getMainLooper())的區別如果你不帶引數的例項化:Handler handler = new Handler();那麼這個會預設用當前執行緒的looper一般
C#關於多執行緒及執行緒同步 lock鎖的應用
Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;
C++11多執行緒程式設計 第十章: 使用packaged_task優雅的讓同步函式非同步執行
C++11 Multithreading – Part 10: packaged_task<> Example and Tutorial Varun July 2, 2017 C++11 Multithreading – Part 10: packaged_tas
C++11多執行緒程式設計 第六章: 多執行緒之間的事件處理
C++11 Multithreading – Part 6: Need of Event Handling Varun June 1, 2015 C++11 Multithreading – Part 6: Need of Event Handling2018-08-18T1
執行緒同步工具(三)等待多個併發事件完成
宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷 等待多個併發事件完成 Java併發API提供這樣的類,它允許1個或者多個執行緒一直等待,直到一組操作執行完成。 這個類就是Count
c語言 多執行緒的簡單實現 執行緒鎖
#include <stdio.h> #include <math.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #i
C++11 多執行緒學習----std::thread類的簡單使用
一 C++11多執行緒簡介 C++11標準庫會提供類thread(std::thread)。若要執行一個執行緒,可以建立一個類thread的實體,其初始引數為一個函式物件,以及該函式物件所需要的
C++11多執行緒std::thread的簡單使用
在cocos2dx 2.0時代,我們使用的是pthread庫,是一套使用者級執行緒庫,被廣泛地使用在跨平臺應用上。但在cocos2dx 3.0中並未發現有pthread的支援檔案,原來c++11中已經擁有了一個更好用的用於執行緒操作的類std::thread。cocos
單執行緒、多執行緒以及事件驅動程式設計模型對比
中文版全文:http://blog.csdn.net/hanhuili/article/details/9389433#comments 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來