1

これはあなたにとってばかげた質問かもしれません..しかし、私にはうまくいきません! (WinRT の新機能 .. Windows もそうかもしれません!) セマフォを作成しようとして、それを取得しようとしているだけです。しかし、それは WAIT_FAILED: 5 (アクセスが拒否されました) で失敗します

void MainPage::simple_Sema_test1()
{

    HANDLE p_sema;
    DWORD ret, err;
    p_sema = CreateSemaphoreEx(NULL, 1, MAX_LIMIT, L"sema1", 0, SEMAPHORE_MODIFY_STATE);
    if(p_sema == NULL)
        print_on_textbox("CreateSemaphoreEx Failed!\n");
    ret = WaitForSingleObjectEx(p_sema, 1000, TRUE);
    switch(ret){
    case WAIT_ABANDONED:
        print_on_textbox("WAIT_ABANDONED\n");
    case WAIT_IO_COMPLETION:
        print_on_textbox("WAIT_IO_COMPLETION\n");
    case WAIT_OBJECT_0:
        print_on_textbox("WAIT_OBJECT_0\n");
    case WAIT_TIMEOUT:
        print_on_textbox("WAIT_TIMEOUT\n");
    case WAIT_FAILED:
        print_on_textbox("WAIT_FAILED: " + (GetLastError()).ToString());
}

<<< を編集 (一部解決済み) SEMAPHORE_ALL_ACCESS でセマフォを作成

すなわち

*sema = CreateSemaphoreEx(NULL, initial, MAX_LIMIT, L"sema1", 0, SEMAPHORE_ALL_ACCESS);

変更アクセスで機能しなかった理由を誰かが知っている場合は、説明してください!

4

1 に答える 1

4

同期オブジェクトを待機するには、SYNCHRONIZEアクセス権が必要です:

SYNCHRONIZE: オブジェクトを同期に使用する権利。これにより、オブジェクトがシグナル状態になるまでスレッドを待機させることができます。

SEMAPHORE_ALL_ACCESS値にはSYNCHRONIZEフラグが含まれます。

于 2012-07-19T23:07:49.367 に答える