気になったので再度
グローバルでやってみたら出来ました。
unsigned __stdcall counter(void *arg);
unsigned __stdcall counter(void *arg)
{
return(0);
}
void CN_ThreadView::OnAthread()
{
int thread_id1;
unsigned dummy;
thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
}
nさん, monkeyさんどうもお手数をお掛けしました。
理由は
>クラスのメンバ関数の場合はこういったコールバック関数にすることはできないので、
staticにする必要があります。
>スレッドに渡すコールバック関数は,staticメンバ
関数にするか,グローバル関数にする必要があります
だったんですね(でも何でかが分からないのですが先にすすみます)
解決です
どうも
> (でも何でかが分からないのですが先にすすみます)
それは、大変、やめたほうがいいと思います。
後々怖いので、聞かれてませんが何でだか解説しておきますと…
> thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
ここで渡してる counter ってのは、それが static かグローバルならば、プログラム中
に一つしかありませんから、アドレスを特定することが可能です。
でも、static でないメンバ関数の場合、counter 関数は CN_ThreadView クラスのイン
スタンスの数だけ存在しますから、どのアドレスを取ったらいいかわかりません。
で、エラーっちゃうわけです。
>でも、static でないメンバ関数の場合、counter 関数は CN_ThreadView クラスのイン
>スタンスの数だけ存在しますから、どのアドレスを取ったらいいかわかりません。
シャノンさん、うそ(間違ったこと)教えちゃいけません
非スタチックなメンバー函数(かんすう)がインスタンスの数だけあったら、リンカーは
どうやって区別したらいいんですか?
非スタチックなメンバー函数はどのインスタンスかを知らせるために、コンパイラーが
this ポインターを(コンパイル時に)渡すようにコードを生成するので、どのインスタンス
を扱うか知ることが出来るのです。ところが、 Windows API は C++ のことなど知りません
から(言語依存ではないので) C++ の非スタチックなメンバー函数が函数ポインターとして
渡って来てもどのインスタンスかについて知らないので呼び出せないということなのです
なんだかわからないので先に進みますはやめましょう。
後で大ハマリする原因です。
納得できるまで食い下がっとかないと痛い目を見るのは自分ですから。
どうも、C++の知識が足りないように感じます。
出来れば、C++の勉強からはじめた方が良いですよ。
MFCを使わないコンソールアプリケーションなどを使って
C++の入門書で勉強してみてはどうですか?
間違ってもVC++の入門書で勉強したりしないようにしましょう。
開発環境の入門書を使っても言語の勉強は出来ません。
追伸
「シャノンさん、うそ(間違ったこと)教えちゃいけません」
これは言いすぎかなと思いますよ。
誰にでも勘違いはありますから。
「シャノンさん、それは間違ってますよ。」
で十分だと思います。
あら、タイプミス。
>なんだかわからないので先に進みますはやめましょう。
なんだかわからないのですが先に進みますはやめましょう。
です。
> これは言いすぎかなと思いますよ。
構いませんよ。間違ったことを教えようとしてたのは確かです。
嘘をついた覚えはありませんが…
#無知は無罪でも、知ったかぶりは罪です(法律的にとかじゃなくてね)
「よーし、インスタンスの数だけあるかどうか確かめてやろうじゃないか」
#include <iostream>
class Test
{
public:
void PrintMemberFunctionAddress()
{
void ( Test::*pFunc )() = &Test::PrintMemberFunctionAddress;
std::cout << pFunc << std::endl;
}
};
int main()
{
Test test[ 5 ];
for( int i = 0; i < 5; i++ )
{
test[ i ].PrintMemberFunctionAddress();
}
return 0;
}
結果:
1
1
1
1
1
確かにメンバ関数のアドレスは全部同じ。実体は一つなのか…
「でも 1 って何ー!?」
> どうも、C++の知識が足りないように感じます。
まったくです>俺
>「でも 1 って何ー!?」
メンバ関数のポインタ配列がどこかに置かれてて、そのインデックスなのかも…?
雑談板でちょっとまえに話題に上がったけど、
スレ乗っ取りはよろしくないので雑談板に移動させていただきます。
このスレ本来の話題ではなく、俺っちのカキコにレスくださるかたはあちらへ…