因みに_beginthread、_beginthreadexでスレッドを作成するとMFCのAPIは使えないそうです。
その辺も考慮に入れて決められた方がよろしいと思います。
PATIOさん、コメント、ありがとうございました。
今回、MFCは、一切、使用していないので、大丈夫だと思います。
ありがとうございました。
> 因みに _beginthread、_beginthreadex でスレッドを作成すると MFC の API は使え
ないそうです。
↑これは、「スレッドプロシージャ内部では MFC の API ( メソッド? ) が利用できな
い。」という意味でよいのですよね?
私は、そう思ってたのですが・・・。
もしかして、どこであれ、一切使ってはいけないということなのでしょうか?
VC6のMFCのソースを見ると2つあるAfxBeginThread()はどちらも
CWinThread::CreateThread()を呼んでいて、その中で_beginthreadex()を呼んでいます
上記のことから考えると下記のように考えられますがどうでしょうか
CreateThread -> ×標準関数,×MFC
_beginthreadex -> ○標準関数,×MFC
AfxBeginThread -> ○標準関数,○MFC
> もしかして、どこであれ、一切使ってはいけないということなのでしょうか?
私はnemuさんと同じように考えますが、よくはわからないです
仕事ではマルチスレッドを使った事がないので詳しくないのですが...
> CreateThread -> ×標準関数,×MFC
> _beginthreadex -> ○標準関数,×MFC
> AfxBeginThread -> ○標準関数,○MFC
とすると、CreateThread() は純粋に SDK な場合にしか使用できないということです
ね。
あと、少し話題がそれますが、
VC7 からは CString は MFC の枠組を抜けて、どっか ( ATL? ) に移動したと聞いたの
ですが、
それは、_beginthreadex() で作られたスレッド内でも CString が使えるということな
のでしょうか?
kuさん、nemuさん、コメントありがとうございます。
皆さんのコメントで、スレッドについて、良く、わかりました。
今回、_beginthreadex() にしたら、動作しました。
どこかで、1ヶ所だけ、標準関数を使用していました。
お騒がせしました。
ただ、
>それは、_beginthreadex() で作られたスレッド内でも CString が使えるということな
>のでしょうか?
という件ですが、誰か分かる人がいたら、教えてください。
私も、知りたいです。
すいません、舌足らずで。
私が提示したHPを見ていただければ解ると思いますが、
作成したスレッドのほうで使用できないという話です。
このホームページを読み返していて気が付いたんですが、
kuさんが言われているようにCreateThreadでは駄目と書いてありますけれど、
AfxBeginThreadに関してはそういう記述はないみたいです。
私の勘違いですね。
AfxBeginThreadは両方とも良いという話になるとMFCでコードを書く時は
とにかく、AfxBeginThreadという事になりますね。
ところで、ATLってSTLとは別物だと思うんですが、
ATLは標準の方に入ると考えていいんですかねぇ?
私はむしろMFCよりだと思っていたんですけれど。
ATLが内部の実装部分にMFCを使っているのであれば、
ATLを使う場合はAfxBeginThreadを使わないといけないという事になると思うんですけれど。
> ところで、ATLってSTLとは別物だと思うんですが、
勿論。
> ATLは標準の方に入ると考えていいんですかねぇ?
少なくとも C/C++ 標準ではない。
単にどちらも Template Library の頭文字をとっているというだけ。
ATL 自体は(ちゃんと全部を確認したわけじゃないが) 基本的に native Win32 実装だから
標準 C/C++ ライブラリも使ってないと思う。
> ATLが内部の実装部分にMFCを使っているのであれば、
> ATLを使う場合はAfxBeginThreadを使わないといけないという事になると思うんですけれど。
少なくともわざわざ MFC なんてダメなものを使ったりはしない。
CString にしても、MFC が ATL のものを使うようになったという方が現実に近いから、
少なくとも AfxBeginThread なんてしろものはイラナイのでは?
>ATLが内部の実装部分にMFCを使っているのであれば、
>ATLを使う場合はAfxBeginThreadを使わないといけないという事になると思う
↓このページによると、ATL は非 MFC のようです。
ttp://home.att.ne.jp/banana/akatsuki/doc/atlwtl/atlwtl01-01/
なるほど、ATLのみを使う分にはAfxBeginThreadは必要なさそうですね。
MFCの実装の全てが正しいとは言いませんけれど、
駄目な物と言うのは言いすぎだと思いますよ。
少なくともフレームワークとしては良くできていると思いますし。
まあ、ピューリファイなんかで調べるとMFCの内部でメモリーリークが
ずんどこ検出されたりするので実装そのものに問題がある部分はあると
思いますけどね。この辺はピューリファイの誤検出なのか、
MFC側の不具合なのかいまひとつ解ってないんですけれど。
CString自体は、STLとMFCがうまくなじまないからMSが新たに起こした
クラスだというのは見え見えですが、VC7ではMFCは全てATLに移行したんですか?
CStringを使うだけの話なら、AfxBeginThreadはいらないでしょうけれど、
まだ、MFCに機能が残っているのであれば、その部分を使う時は必要だと思います。
> MFC が ATL のものを使うようになったという方が現実に近いから
表現が悪かった。中身が template ベースになったという程度の意味な。
もともと CString は MFC 発祥 -> WTL に展開したもんだし。
WTL::CString 対応の延長先に今があるんだろうと思う。
> VC7ではMFCは全てATLに移行したんですか?
別にどちらも移行などしてない。
native Win32 を、片や template でジェネリックに、
片や class でオブジェクト指向風味にラップしてるはずで、
本来は直交するべきはずのもん。
MFC はそのわりにクラス構成が設計的にボテッとしてて美しくないから
個人的に嫌いなだけでそれ以上の他意はない。
MFC 使うといらだつし、漏れは ATL/WTL が好きだが、
用途次第で役には立つのだろう。
俺的に大粒な構成が今ひとつだと思うフレームワークくらいに訂正。
実装の不具合とは別次元の話。
人によっては ATL の多重継承が理解できずに嫌うんだろうが、
それも C++ におけるインターフェイスは多重継承で実装されるが故。
所詮は好みの問題か。
個人的には、WTLが好きなので、そちらを使いますが、ちょっとした
作りこまなくても良い程度のツールであれば、MFCを使う事もあります。
WTLはWinMainを隠蔽しないので、C言語に慣れた自分としては、
そちらの方が分かりやすい、というのもあります。
# ATL7のCStringは、CStringT<char> とCStringT<wchar_t>でしったっけ?
# WTL7のCString は、TCHAR ベース。
個人的にはATL/WTL路線も良いと考えています。
ある程度の基本構造を残しつつ、コーディングの手間も減らせますし、
実行ファイルもコンパクトに出来るみたいですね。
MFCの場合は、昔の実装を引きずっているためにどうしてもスマートでない
部分があるのは仕方ないかもしれません。
あれはあれとして適材適所に使えばいいわけですし、
フレームワークを理解して利用する分にはそれなりに使えるものだと
私は思います。
まあ、状況によってはMFCでやってくれと言う場合もなきにしもあらず。
受注元の条件なら四の五の言ってられませんしね。