簡単なコールバック関数の使用と作成
一般的なコールバック関数では、シーンが使用されます.メインスレッドは、イベントのトリガーを待ってから、すぐにアクションをトリガーする必要があります.たとえば、メインコントローラは、現在のシーンに車両が入っているかどうかをループして監視し、入ったときに操作をトリガーします.この操作は、呼び出しスレッドで実行されます.コード例:コールバック関数スレッド:ヘッダファイル:
cppファイル
次に、上記のエクスポート関数を呼び出す必要があります.
これで,簡単なコールバック関数の実現方式は終了した.注意:コールバック関数体は必ずグローバル関数または静的メンバー関数である(同じ理屈).そのため、スレッドのセキュリティに問題があります.したがって、パラメータを追加するときは、どのスレッドがトリガーしたイベントを区別する必要があります.後で話す機会がある.
#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();
}
これで,簡単なコールバック関数の実現方式は終了した.注意:コールバック関数体は必ずグローバル関数または静的メンバー関数である(同じ理屈).そのため、スレッドのセキュリティに問題があります.したがって、パラメータを追加するときは、どのスレッドがトリガーしたイベントを区別する必要があります.後で話す機会がある.