こんにちは。VC6.0MFCでプログラム作ってます。
簡単ではありますが、ボタン押下でthreadを生成するプログラムです。
void CxxxxxDlg::OnButton()
{
/* 省略 */
int nRet = _beginthread(Thread, 0, NULL);
/* 省略 */
}
void Thread()
{
/* 省略 */
}
これをビルドすると・・・
以下引用-----------------------
error C2664: '_beginthread' : 1 番目の引数を 'void (void)' から
'void (__cdecl *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
引用ここまで-----------------------
とエラーが出てしまいます。クラスのメンバ関数からCの関数を呼び出すには
どのようにすれば良いのでしょうか?「Thread()」のプロトタイプ宣言を色々
書いてみたりしたのですが駄目でした。
以上宜しくお願いします。
エラーメッセージの通りです。
beginthread の 1 番目の引数の方が間違っています。
void (__cdecl *)(void *) 型つまり、
> void Thread()
は void Thread( void* )
という関数でないといけません。
変換ミス+typoです。
> beginthread の 1 番目の引数の方が間違っています。
_beginthread の 1 番目の引数の型が間違っています。
まあそれ以前の問題として MFC では _beginthread つかってはいけないのですが。
AfxBeginThread にしないと誤動作します。
WINDOWS上で動くスレッドを作成するのでしたら、
MFC関数であれば「AfxBeginThread」、SDKなら、「CreateThread」を使うことのがいい
と思います。
何か問題が起こる可能性があります。
例によると、
_beginthread( Bounce, 0, (void *) (ch++) );
スレッド関数側
void Bounce( void *ch )
{
}
です。
MSDNライブラリーにサンプルがあります。
皆さんお返事ありがとうございます。
今お昼休みで見たので後で試してみます。
>まあそれ以前の問題として MFC では _beginthread つかってはいけないのですが。
>AfxBeginThread にしないと誤動作します。
Cのライブラリを使用する場合は_beginthreadでは?と思ったのですが、
「非MFC上で」使う場合に限ってたかな?再度MSDN読み返して試してみます。
Blueさんのレスでうまく解決できました。
ありがとうございました。
「_beginthread」は、「MFC」に限らず、Windows系のソフトを作るのには、適当でない
と思います。
MFCを使わないときは、「CreateThread」等を使ったほうがいいと思います。
> Cのライブラリを使用する場合は_beginthreadでは?と思ったのですが、
> 「非MFC上で」使う場合に限ってたかな?再度MSDN読み返して試してみます。
<MSDN>
C のランタイムライブラリに記録されている関数を使うスレッドは、
CreateThread 関数と ExitThread 関数ではなく、
C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。
この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。
</MSDN>
> 「_beginthread」は、「MFC」に限らず、Windows系のソフトを作るのには、適当でない
> と思います。
> MFCを使わないときは、「CreateThread」等を使ったほうがいいと思います。
MFCを使わないなら_beginthreadまたは_beginthreadexをとりあえず使っておくのが正解
です。
CreateThreadは基本的に使いません。
理由はBanさんが書かれたとおりなのですが,
C++の実装は裏でCRTを使っていたりするので,
C++を使うのであればCreateThreadの利用は「あり得ない」ということになります。
# たとえば,new演算子はmallocが内部で利用しているルーチンを呼び出す。
ちなみに,AfxBeginThreadはCWinThread::CreateThreadを,
CWinThread::CreateThreadは_beginthreadexを,
_begintrheadおよび_beginthreadexはCreateThread APIを呼び出します。
# VC++ 7.1の場合。
YuOさん
了解しました。
「_begintrhead」で、「CreateThread API」を呼び出しているのですね。
僕の知識不足でした。