質問に『AfxBeginThreadが止まる原因は何があるのでしょうか』
とあるし、私も知りたいです。
『サンプルとか見てみるとすぐわかる』
俺には、このアドバイスではまったくわからん。
『こういう[危]なプログラムより』
俺には、これがどう[危]なのかわからん。
ちょっと煽りになってた?
ごめんね。
そんなことより、
結局原因がわからないまま
『CWinThreadから派生クラス作ったら現象が起きなくなりました。』
『解決です』
なんてことになるほうがよほど
その場しのぎで動くようにしてしまうのではないかと思った。
>終了するスレッドの内部からは呼び出さないでください。
誤訳だろうな。
変な説明や間違ったサンプルがあっても直されていないままが多いね。
特にこれは否定と肯定が逆だからひどいね。
> ローカルオブジェクトのデストラクタを呼ばずにスレッドだけ終了してしまうから、
> 私なら絶対に使いませんけど AfxEndThread
俺もAfxEndThreadつかわない。
returnで充分。
> 動かない EXE ってシングルスレッドモデルでコンパイルされていませんか?
なるほど!
そりゃ危険だ。
おれも、AfxBeginThreadで止まるってホントなのか気になるな。
AfxBeginThreadを実行するスレッドがフリーズするってことか?
> 情報どうも。しかし、だったらなおさら、なぜCWinThreadの作成をAfxBeginThreadに
一
-- snip --
> ういう使い方が普通でしょ(T-T)。(それとも私は変なプログラマー?)。
どっちも可能な方法であり、問題ない。
というか問題あったら困るよ。
今でも両方ともスレッドを使う方法として知られている、使われているものですから。
自分の慣れた方法が自分にとって簡単な方法であり普通なんですよ。
自分が知らない、やったことない方法なんて簡単とはいえないんですよ。
普通の根拠なんてその程度。
状況の違う他人にはまったく普通には思えない。
何百人にアンケートとったり、
たくさんの書物を調べて普通という根拠を見出したわけじゃないでしょ。
ムキ身だから危険とか、派生クラスだから安全というのも、
具体的に根拠を示してください。あなたの感覚的なものではなくて。
なんちゃってね テヘヘ
派生クラス作らないといけないのかよメンドクセー
> ユーザー インターフェイス スレッドを作成されているのではないですか?
というか、UIスレッドか?ワーカースレッドか?などというのは呼び方の違いなだけで
元は同じものだと認識してましたが?
> 単純なワーカー スレッドを実行する場合は、CWinThread がそのまま使えます。
ですから前に「プログラムが大きくなればスレッドをクラスにしておいた方が楽」と記
述しています。スレッドの処理自体が20~30行程度の単純なものでしたらムキ身関数に
入れて実行した方が簡単かもしれませんね。ただバラモンさんの場合DLLにして分けたい
位の処理ですから、関数一個に収まるような単純なモノだと思えませんね(関数一個DLL
にする人いませんから)。Banさんの提示の中にもありますが、「専用の派生クラスが必
要」だと思います。
> exeによって
とありますが、実行環境は開発環境と同じWindows2000でしょうか。
Windows9Xとかが絡んでくると、別の要因もありそうなので。
> 俺には、これがどう[危]なのかわからん。
現在の状態が[危]でなくともUINT ThreadProc(LPVOID)の中身が大きくなればいくらでも
[危]になりますよ。マルチスレッド自体ただでさえも[危]なんですから。
> ムキ身だから危険とか、派生クラスだから安全というのも、
> 具体的に根拠を示してください。あなたの感覚的なものではなくて。
もうしわけないけど、具体的な根拠はないです。全て私の感覚でモノ言ってます。でも
こういう感覚ってプログラムではけっこう大切なのでは?自分の書いたプログラムの具
体的根拠全部分かる位なら苦労しませんよ。
> 派生クラス作らないといけないのかよメンドクセー
最初にスケルトン作っておけばあとはそれコピーするだけ。楽ですよ。
> 現在の状態が[危]でなくともUINT ThreadProc(LPVOID)の中身が大きくなればいくらで
も
> [危]になりますよ。マルチスレッド自体ただでさえも[危]なんですから。
1つのメソッドが巨大になれば、クラスにしようが同じだろ。
ThreadProcからサブルーチンを呼び出してもいいし、
クラス(メソッド)を呼び出してもいいし。
まちがった感覚や思い込みなら、いらない。
1つのメソッド(関数)が巨大になれば、プログラムが混沌として
保守しにくくなるとか、ちゃんと理由があるじゃん。
感覚でプログラム作ってんのかよ
恐エー
> 感覚でプログラム作ってんのかよ
> 恐エー
経験の積み重ねによって培われた感覚ならば、それは確かだ。恐くない。
だからといて、
AfxBeginThreadを使うと危険だとか、
CWinThread派生でCThreadが普通とか言われたくないな。
AfxBeginThreadからCWinThread::CThread呼んでいるし。
そしてCWinThread::CThreadからメンバ関数じゃない
関数をスレッドスタートにしているんだし。
その積み重ねた経験があるならいいよ。あるなら。
その経験を伝授せずに、
誰だか忘れたし理由は知らないからなんていうのはなしだ。
デマとか間違えとか鵜呑みにしたり、
既成概念とか常識とかにとらわれるわけには行かない。←オイオイダソクダヨ
あ!CWinThread::CreateThreadの間違え。
俺ってムカつくだろ
もしかして怒ってる
ごめんね
> AfxBeginThreadを使うと危険だとか、
> CWinThread派生でCThreadが普通とか言われたくないな。
それには同意。
# C/C++自体、身の毛もよだつ危険な言語だし (^^
> 誰だか忘れたし理由は知らないからなんていうのはなしだ。
まったくもってそのとーり。
> ThreadProcからサブルーチンを呼び出してもいいし、
> クラス(メソッド)を呼び出してもいいし。
そういうプログラムの組み方が自体が[危]だって言ってんの!MFCベースのプログラムの
中にそんな事してる関数がボコボコあるようなプログラムでアプリケーション一個きっ
ちり動かせたらそりゃ大したプログラマーだが、そんな過激な事板で推奨する事ないだ
ろ!
> 俺ってムカつくだろ
この板5~6年前からたま~に見てるけど、超初心者に免疫ないからけっこうムカつく
(;;。余談だけど5年以上たっても未だにεπιστημηをなんて読むのか覚えられな
い、、、。数年前に雑談掲示板で読み方公開してるの読んだけど難しくて忘れた。。。
MFCベースでメンバ関数じゃない関数があるという理由で[危]なプログラミングとか
動かせたらそりゃ大したプログラマだがとか過激な事とかひどいこという人ですね。
でもそれは私のことを大したプログラマといっているのですね。
ありがとう。
CWinThread に対する主従の考え方が、とも さんと逆なのかな、という気がしました。
C++ で書いてる以上、OO としてのクラス化や隠蔽は言わずもがなだと思いますが、
この前提に立ったとき、CWinThread を継承して安全になる根拠が私には見えてません。
なので、隠蔽の粒度が、CWinThread の中か外かの違いで食い違ってるのかな、と。
私自身は、あくまでモデル上の別のクラスがあって、
(名前も示すとおり)ワーカスレッドなどはそのメンバ程度でしかない事が多い。
ワーカスレッドの CWinThread などは、従物に過ぎないと思っているのですが、
多分、とも さんの認識ではまず CWinThread ありきなのかなと。
(前提として、MFC とモデル上のクラスを多重継承するのは避けてます)
私は、モデル上の意味があるクラスを起こす設計の方が好みです。
# CWinThread の役目はせいぜいメンバ止まり。
ワーカスレッドを使うような内部処理はマルチプラットフォームが前提にあることも多
く、
「MFC (というか Windows)依存部は UI 部等に局所化する」という要件から、
そもそも CWinThread が選択肢に入らないことも多々ありますが....。
# なんか、ワーカスレッドのために CWinThread を継承してそこに処理を書くのって、
# CDocument のサブクラスを直接モデルで使うくらいには違和感があります。
> 動かせたらそりゃ大したプログラマだがとか過激な事とかひどいこという人ですね。
ひどい事言ってすみません。ちょっとムキになちゃいました(反省)。たまにはこの板
に遊びに来るので(年に数回ですが)また相手にして下さい。