下記のコードでC2664エラーが発生します
(VC++6.0 SP6)
unsigned _stdcall ****::counter(void *arg)
{
// 簡単なタイマー
return(0);
}
void ****::OnAthread()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
int thread_id1;
unsigned dummy;
// 省略
thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
// 省略
}
--- error ----------------------
\*****.cpp(171) : error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int
(void *)' から
'unsigned int (__stdcall *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
このエラーが解決できません。
*.c ではとおるのですが *.cpp ではエラーになります
すみませんが宜しくお願い致します。
関数counterの型が_beginthreadex関数の第3引数の型と一致していないというエラーで
す.
# エラーメッセージのとおりなんだけどなぁ
counter だと「関数へのポインタ」 が式の値になり、
counter() とすれば関数の「戻り値」 が式の値になります。
あ、スレッドか。失礼。
どうもレス有難うございます
*.c だと OK なんですけ?
エラーメッセージとうりなんですけど、何で見つからないのか?
countは1個しかないんでけど
宜しくお願い致します。
cだと::なんて通らないですよね?
コードとエラー内容とが違ってないですか?
こんにちわ
VC++用に書き換えたんです
VC++で実行したかったので。
*c だと下記のようになります。
これは OKなんですが?
#include <stdio.h> /* VC では使用してない */
#include <sys/types.h>
#include <process.h>
#include <windows.h> /* VC では使用してない */
unsigned _stdcall counter(void *arg)
{
/* 略 */
return(0);
}
void main()
{
int thread_id1;
unsigned dummy;
/* 略 */
thread_id1= _beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
/* */
}
よろしくお願いします。
ついか
を使用するので
プロジェクトの設定の中のC/C++の項目の
プロジェクトオプションで /MT を追加してます
宜しくお願いします
> 'unsigned int (__stdcall X::*)(void *)' から…に変換することはできません
^^^
エラーメッセージはこう↑じゃなかったですか?(Xはクラス名)
クラスのメンバ関数の場合はこういったコールバック関数にすることはできないので、
staticにする必要があります。
たびたびすみません
error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int (void *)' か
ら 'unsigned int (__stdcall *)(void *)' に変換できません。
となってます
unsigned __stdcall Func( void* )
^^^^^^^^^
という風にすればOKでは。
申し訳ない.なんか勘違いしてました.
他の方がおっしゃっているように,スレッドに渡すコールバック関数は,staticメンバ
関数にするか,グローバル関数にする必要があります.
こんばんわ
nさん、monkeyさん
レス有難うございます
ご指摘の内容でやってみたのですが、変化はありませんでした。
static関数,グローバルでやってみようと思います。
今日は遅くなってので後日、トライして結果を報告します。
でも、IEで検索していたのでがなんとなく難しそう。
ついか
ちなみに他の部分が悪さしてるかと思い
他を全部削って下記の内容でやってみたのですが、同じエラーでした
くたびれた一日でした ^^;
#include <sys/types.h>
#include <process.h>
--- *.h -----
class CN_ThreadView : public CScrollView
{
public:
unsigned __stdcall counter(void *arg);
以下略
}
--- prg -----
unsigned __stdcall CN_ThreadView::counter(void *arg)
{
return(0);
}
void CN_ThreadView::OnAthread()
{
int thread_id1;
unsigned dummy;
thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
}
> static関数,グローバルでやってみようと思います。
> でも、IEで検索していたのでがなんとなく難しそう。
どーってことはないですよ。
> --- *.h -----
> class CN_ThreadView : public CScrollView
> {
> public:
> unsigned __stdcall counter(void *arg);
> 以下略
> }
static unsigned __stdcall counter(void *arg);
ってするだけです。