TryEnterCriticalSection()について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
組木紙織

TryEnterCriticalSection()について

#1

投稿記事 by 組木紙織 » 15年前

現在ゲームを作っています。
(なぜか)参考書のダブルバッファリングのサンプルがマルチスレッドになってるので、
マルチスレッドで作っています。

そこで次のような問題が出ました。
クリティカルセクションを扱う関数のうち
InitializeCriticalSection()やEnterCriticalSectionなどは使えるのですが、
TryEnterCriticalSection()を使おうとするともともと存在しないのかコンパイルエラーが起きます。

ミューテックスとWaitSingleObject()のタイムアウトを0に設定することを
代替案として使うことでなんとかなりますが、
なぜこのTryEnterCriticalSection()が使えないのか分かりません。
知ってい方説明をください。

#MSDNには Windows 95/98系ではサポートされてないと書いてあるのですが、
#私の環境はVistaなので(多分)このこととは関係ないと思っています。


以下開発環境
OS:Vista Home Premium

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
Microsoft .NET Framework
Version 2.0.50727 SP2
Microsoft Visual C++ 2005 77972-233-0832431-41598
Microsoft Visual C++ 2005

たかぎ

Re:TryEnterCriticalSection()について

#2

投稿記事 by たかぎ » 15年前

コンパイルエラーですか? リンクエラーではなくて。

この手の問題は、

#define _WIN32_WINNT 0x0500

を定義すれば解消したように記憶していますが、リンクではなくて、コンパイルエラーなら、単なるミススペルとか、別の原因かもしれません。

実行環境がWindows 98だとかVistaだとかは、ビルドの際には何の関係もありませんね。

組木紙織

Re:TryEnterCriticalSection()について

#3

投稿記事 by 組木紙織 » 15年前

>コンパイルエラーですか? リンクエラーではなくて。
間違いなくコンパイルエラーです。
スペルミスとかも色々調べた結果原因が分からなかったので質問させてもらいました。

#define _WIN32_WINNT 0x0500
を定義することでコンパイルエラーが解消され、無事コンパイル&実行できるようになりました。
問題が起きたコードをすべてあげると長いので状況を再現できるコードを作ったので一応あげておきます。
確認をしたい方はどうぞ

/**************************
TryEnterCriticalSection()が使えるかどうかの確認のためのソースコード
***************************/
#pragma comment(lib,"winmm.lib")
//ここのdefineを忘れるとコンパイルエラーになる
//#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <iostream>
#include <process.h>


CRITICAL_SECTION critical;


unsigned int __stdcall ThreadFunc(void* p_num )
{
volatile int* num = reinterpret_cast<volatile int*>(p_num);

int a =0;
while(*num)
{
// ここのTryEnterCriticalSection()のためにコンパイルエラーが起きる
BOOL flag = TryEnterCriticalSection(&critical);
if(flag ==TRUE)
{
a++;
}
std::cout << a << std::endl;
Sleep(10);
}
std::cout << "end" << std::endl;
_endthreadex(0);
return 0;
}


int main()
{
int num;
uintptr_t thread;
InitializeCriticalSection(&critical);
thread = _beginthreadex( NULL,0,&ThreadFunc,&num,0,0);

::EnterCriticalSection(&critical);
Sleep(1000);
::LeaveCriticalSection(&critical);
Sleep(1000);
num =0;
Sleep(1000);
::DeleteCriticalSection(&critical);

return 0;
}

画像

組木紙織

Re:TryEnterCriticalSection()について

#4

投稿記事 by 組木紙織 » 15年前

ちょっと調べてみました。
#define _WIN32_WINNT 0x0500
実行環境を設定するマクロのようです。

http://msdn.microsoft.com/ja-jp/library/6sehtctf.aspx

閉鎖

“C言語何でも質問掲示板” へ戻る