簡単なコールバック関数の使用と作成


一般的なコールバック関数では、シーンが使用されます.メインスレッドは、イベントのトリガーを待ってから、すぐにアクションをトリガーする必要があります.たとえば、メインコントローラは、現在のシーンに車両が入っているかどうかをループして監視し、入ったときに操作をトリガーします.この操作は、呼び出しスレッドで実行されます.コード例:コールバック関数スレッド:ヘッダファイル:
#pragma once
#include "iostream"

using namespace std;
//      
#ifdef _WIN32
#define TE_VIDEO_API extern "C" __declspec(dllexport)
#else
#define TE_VIDEO_API extern "C"
#endif

typedef void* TE_HANDLE;
//         
typedef int(*PFN_OnDisplayCallback)(TE_HANDLE hDevice, char *pBuffer, int nBuffLen, void *pUserData);
//       
TE_VIDEO_API TE_HANDLE TEStartWork(TE_HANDLE handle);
//       
TE_VIDEO_API TE_HANDLE TE_RegisterCallback(PFN_OnDisplayCallback pfnDisplayCallback, void* param);
//        
TE_VIDEO_API TE_HANDLE TE_UnRegisterCallback();


cppファイル
#include "iostream"
#include "windows.h"
#include "test.h"

using namespace std;

PFN_OnDisplayCallback g_pfnCallBack;
void* g_pParam;
DWORD WINAPI ThreadDone(PVOID param)
{
    ***while (true)
    {
        if (g_pfnCallBack != NULL)
        {
            if (/*    */)
            {
                //          。
                g_pfnCallBack(NULL, NULL, 0, g_pParam);
            }
        }
    }***
}
//           ,       ,       
TE_VIDEO_API TE_HANDLE TEStartWork(TE_HANDLE handle)
{
    g_pfnCallBack = NULL;
    g_pParam = NULL;
    /*
          ,  windows         。       ,       
    */
    LPDWORD pThread;
    HANDLE hThread = (NULL, 0, ThreadDone, NULL, CREATE_SUSPENDED, pThread);
    ResumeThread(hThread);
}
//         
TE_VIDEO_API TE_HANDLE TE_RegisterCallback(PFN_OnDisplayCallback pfnDisplayCallback, void* param)
{
    if (pfnDisplayCallback != NULL)
    {
        g_pfnCallBack = pfnDisplayCallback;
        g_pParam = param;
    }
}
//         
TE_VIDEO_API TE_HANDLE TE_UnRegisterCallback()
{
    pfnDisplayCallback = NULL;
}


次に、上記のエクスポート関数を呼び出す必要があります.
//          
#include "test.h"
#include "iostream"

using namespace std;
//              
PFN_OnDisplayCallback procCB(TE_HANDLE hDevice, char *pBuffer, int nBuffLen, void *pUserData)
{
    //             
}

int main()
{
    TEStartWork(NULL);

    TE_RegisterCallback(procCB, NULL);

    Sleep(10000);

    TE_UnRegisterCallback();
}

これで,簡単なコールバック関数の実現方式は終了した.注意:コールバック関数体は必ずグローバル関数または静的メンバー関数である(同じ理屈).そのため、スレッドのセキュリティに問題があります.したがって、パラメータを追加するときは、どのスレッドがトリガーしたイベントを区別する必要があります.後で話す機会がある.