beginthreadの使い方。 – プログラミング – Home

通知
すべてクリア

[解決済] beginthreadの使い方。


もんもん
 もんもん
(@もんもん)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

こんにちは。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()」のプロトタイプ宣言を色々
書いてみたりしたのですが駄目でした。

以上宜しくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

エラーメッセージの通りです。

beginthread の 1 番目の引数の方が間違っています。

void (__cdecl *)(void *) 型つまり、
> void Thread()
は void Thread( void* )
という関数でないといけません。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

変換ミス+typoです。
> beginthread の 1 番目の引数の方が間違っています。
_beginthread の 1 番目の引数の型が間違っています。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

まあそれ以前の問題として MFC では _beginthread つかってはいけないのですが。
AfxBeginThread にしないと誤動作します。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

WINDOWS上で動くスレッドを作成するのでしたら、
MFC関数であれば「AfxBeginThread」、SDKなら、「CreateThread」を使うことのがいい
と思います。
何か問題が起こる可能性があります。

例によると、

   _beginthread( Bounce, 0, (void *) (ch++) );
   
   
スレッド関数側
    void Bounce( void *ch )
    {
}

です。

MSDNライブラリーにサンプルがあります。

   


返信引用
もんもん
 もんもん
(@もんもん)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

皆さんお返事ありがとうございます。
今お昼休みで見たので後で試してみます。

>まあそれ以前の問題として MFC では _beginthread つかってはいけないのですが。
>AfxBeginThread にしないと誤動作します。

Cのライブラリを使用する場合は_beginthreadでは?と思ったのですが、
「非MFC上で」使う場合に限ってたかな?再度MSDN読み返して試してみます。


返信引用
もんもん
 もんもん
(@もんもん)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

Blueさんのレスでうまく解決できました。
ありがとうございました。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

「_beginthread」は、「MFC」に限らず、Windows系のソフトを作るのには、適当でない
と思います。
 MFCを使わないときは、「CreateThread」等を使ったほうがいいと思います。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> Cのライブラリを使用する場合は_beginthreadでは?と思ったのですが、
> 「非MFC上で」使う場合に限ってたかな?再度MSDN読み返して試してみます。

<MSDN>
C のランタイムライブラリに記録されている関数を使うスレッドは、
CreateThread 関数と ExitThread 関数ではなく、
C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。
この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。
</MSDN>


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> 「_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の場合。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

YuOさん
了解しました。
「_begintrhead」で、「CreateThread API」を呼び出しているのですね。
僕の知識不足でした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました