1. 程式人生 > >C++簡單多執行緒事件驅動同步通知到主執行緒

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 事件驅動程式設計是一種程式設計正規化,這裡程式的執行流由外部事件來決定。它的特點是包含一個事件迴圈,當外部事件發生時使用回撥機制來