One-Time Başlatmayı Kullanma
Aşağıdaki örneklerde tek seferlik başlatma işlevlerinin kullanımı gösterilmektedir.
Eşzamanlı Örnek
Bu örnekte g_InitOnce
genel değişkeni tek seferlik başlatma yapısıdır.
INIT_ONCE_STATIC_INITkullanılarak statik olarak başlatılır.
OpenEventHandleSync
işlevi, yalnızca bir kez oluşturulan bir olay için bir tanıtıcı değeri döndürür.
InitHandleFunction
geri çağırma işlevinde bulunan başlatma kodunu yürütmek için InitOnceExecuteOnce işlevini çağırır. Geri çağırma işlevi başarılı olursa, OpenEventHandleSync
, lpContexttarafından döndürülen olay tanıtıcısını döndürür; aksi takdirde, INVALID_HANDLE_VALUEdöndürür.
InitHandleFunction
işlemi, tek seferlik başlatma geri çağırma işlevi olan'dır.
InitHandleFunction
olayı oluşturmak için CreateEvent işlevini çağırır ve lpContext parametresinde olay tutamacını döndürür.
#define _WIN32_WINNT 0x0600
#include <windows.h>
// Global variable for one-time initialization structure
INIT_ONCE g_InitOnce = INIT_ONCE_STATIC_INIT; // Static initialization
// Initialization callback function
BOOL CALLBACK InitHandleFunction (
PINIT_ONCE InitOnce,
PVOID Parameter,
PVOID *lpContext);
// Returns a handle to an event object that is created only once
HANDLE OpenEventHandleSync()
{
PVOID lpContext;
BOOL bStatus;
// Execute the initialization callback function
bStatus = InitOnceExecuteOnce(&g_InitOnce, // One-time initialization structure
InitHandleFunction, // Pointer to initialization callback function
NULL, // Optional parameter to callback function (not used)
&lpContext); // Receives pointer to event object stored in g_InitOnce
// InitOnceExecuteOnce function succeeded. Return event object.
if (bStatus)
{
return (HANDLE)lpContext;
}
else
{
return (INVALID_HANDLE_VALUE);
}
}
// Initialization callback function that creates the event object
BOOL CALLBACK InitHandleFunction (
PINIT_ONCE InitOnce, // Pointer to one-time initialization structure
PVOID Parameter, // Optional parameter passed by InitOnceExecuteOnce
PVOID *lpContext) // Receives pointer to event object
{
HANDLE hEvent;
// Create event object
hEvent = CreateEvent(NULL, // Default security descriptor
TRUE, // Manual-reset event object
TRUE, // Initial state of object is signaled
NULL); // Object is unnamed
// Event object creation failed.
if (NULL == hEvent)
{
return FALSE;
}
// Event object creation succeeded.
else
{
*lpContext = hEvent;
return TRUE;
}
}
Zaman Uyumsuz Örnek
Bu örnekte g_InitOnce
genel değişkeni tek seferlik başlatma yapısıdır.
INIT_ONCE_STATIC_INITkullanılarak statik olarak başlatılır.
OpenEventHandleAsync
işlevi, sadece bir kez oluşturulan bir olay için bir tanıtıcı döndürür.
OpenEventHandleAsync
başlatma durumunu girmek için InitOnceBeginInitialize işlevini çağırır.
Çağrı başarılı olursa, kod, olayı oluşturup oluşturmayacağını veya yalnızca başka bir iş parçacığı tarafından oluşturulan olaya bir handle döndürüp döndürmeyeceğini belirlemek için fPending parametresinin değerini denetler.
fPending FALSE ise başlatma işlemi zaten tamamlanmıştır, bu nedenle OpenEventHandleAsync
lpContext parametresinde döndürülen olay tutamacını döndürür. Aksi takdirde, olayı oluşturmak için CreateEvent işlevini ve başlatmayı tamamlamak için InitOnceComplete işlevini çağırır.
InitOnceComplete çağrısı başarılı olursa, OpenEventHandleAsync
yeni olay tanıtıcısını döndürür. Aksi takdirde, başlatmanın başarısız olup olmadığını veya başka bir iş parçacığı tarafından tamamlanıp tamamlanmadığını belirlemek için INIT_ONCE_CHECK_ONLY ile InitOnceBeginInitialize çağırır.
Başlatma başka bir iş parçacığı tarafından tamamlandıysa, OpenEventHandleAsync
, lpContextiçinde döndürülen olay tutamağını döndürür. Aksi takdirde, INVALID_HANDLE_VALUEdöndürür.
#define _WIN32_WINNT 0x0600
#include <windows.h>
// Global variable for one-time initialization structure
INIT_ONCE g_InitOnce = INIT_ONCE_STATIC_INIT; // Static initialization
// Returns a handle to an event object that is created only once
HANDLE OpenEventHandleAsync()
{
PVOID lpContext;
BOOL fStatus;
BOOL fPending;
HANDLE hEvent;
// Begin one-time initialization
fStatus = InitOnceBeginInitialize(&g_InitOnce, // Pointer to one-time initialization structure
INIT_ONCE_ASYNC, // Asynchronous one-time initialization
&fPending, // Receives initialization status
&lpContext); // Receives pointer to data in g_InitOnce
// InitOnceBeginInitialize function failed.
if (!fStatus)
{
return (INVALID_HANDLE_VALUE);
}
// Initialization has already completed and lpContext contains event object.
if (!fPending)
{
return (HANDLE)lpContext;
}
// Create event object for one-time initialization.
hEvent = CreateEvent(NULL, // Default security descriptor
TRUE, // Manual-reset event object
TRUE, // Initial state of object is signaled
NULL); // Object is unnamed
// Event object creation failed.
if (NULL == hEvent)
{
return (INVALID_HANDLE_VALUE);
}
// Complete one-time initialization.
fStatus = InitOnceComplete(&g_InitOnce, // Pointer to one-time initialization structure
INIT_ONCE_ASYNC, // Asynchronous initialization
(PVOID)hEvent); // Pointer to event object to be stored in g_InitOnce
// InitOnceComplete function succeeded. Return event object.
if (fStatus)
{
return hEvent;
}
// Initialization has already completed. Free the local event.
CloseHandle(hEvent);
// Retrieve the final context data.
fStatus = InitOnceBeginInitialize(&g_InitOnce, // Pointer to one-time initialization structure
INIT_ONCE_CHECK_ONLY, // Check whether initialization is complete
&fPending, // Receives initialization status
&lpContext); // Receives pointer to event object in g_InitOnce
// Initialization is complete. Return handle.
if (fStatus && !fPending)
{
return (HANDLE)lpContext;
}
else
{
return INVALID_HANDLE_VALUE;
}
}
İlgili konular