現在ゲームを作っています。
(なぜか)参考書のダブルバッファリングのサンプルがマルチスレッドになってるので、
マルチスレッドで作っています。
そこで次のような問題が出ました。
クリティカルセクションを扱う関数のうち
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
TryEnterCriticalSection()について
Re:TryEnterCriticalSection()について
コンパイルエラーですか? リンクエラーではなくて。
この手の問題は、
#define _WIN32_WINNT 0x0500
を定義すれば解消したように記憶していますが、リンクではなくて、コンパイルエラーなら、単なるミススペルとか、別の原因かもしれません。
実行環境がWindows 98だとかVistaだとかは、ビルドの際には何の関係もありませんね。
この手の問題は、
#define _WIN32_WINNT 0x0500
を定義すれば解消したように記憶していますが、リンクではなくて、コンパイルエラーなら、単なるミススペルとか、別の原因かもしれません。
実行環境がWindows 98だとかVistaだとかは、ビルドの際には何の関係もありませんね。
Re:TryEnterCriticalSection()について
>コンパイルエラーですか? リンクエラーではなくて。
間違いなくコンパイルエラーです。
スペルミスとかも色々調べた結果原因が分からなかったので質問させてもらいました。
#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;
}

間違いなくコンパイルエラーです。
スペルミスとかも色々調べた結果原因が分からなかったので質問させてもらいました。
#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()について
ちょっと調べてみました。
#define _WIN32_WINNT 0x0500
実行環境を設定するマクロのようです。
http://msdn.microsoft.com/ja-jp/library/6sehtctf.aspx
#define _WIN32_WINNT 0x0500
実行環境を設定するマクロのようです。
http://msdn.microsoft.com/ja-jp/library/6sehtctf.aspx