C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: MFC マルチスレッドについて [1]


(過去ログ 13 を表示中)

[トピック内 30 記事 (21 - 30 表示)]  << 0 | 1 >>

■3916 / inTopicNo.21)  Re[4]: MFC マルチスレッドについて
  
□投稿者/ Jitta (342回)-(2007/05/28(Mon) 21:55:23)
Jitta さんの Web サイト
2007/05/28(Mon) 21:55:58 編集(投稿者)

> 多分「ここ!」の部分よりあとになってからスレッドがスタートしないとだめですよね?
ああ、すみません。端折りましたが、そうなっています。resume も端折ってしまってますね。


> volatile じゃん?
これだぁ!!
「メニィ コアで、別々の値参照されたらダメちゃうん?」と思っていたんだけど、
別々の値を参照することになる原因、レジスタに乗っかるのがダメなんだ。


> というか、そういう形にしてるなら、ExitInstance を作ってそこで
> // ★★これっていいのかヨ!!★★
> をやった方がいい気がするw
ああ、なるほど。
だからもう一つの処理は、そうなっているのか<ぉぃ(T^T)


> てことは、スレッド待ち合わせの間に何度でも「メッセージマップされた関数」に入ってくる可能性がありませんか?
コントロールを disable にしているので、それはありません。
一応、待ち合わせ中にアクションを起こし、入ってこないことを確認しています。


> 「ナニがしたいのか」を把握して、書き直しちゃった方が早いんじゃないすか?
ひとつの障害は、MFC でアプリケーションを作れる人がいないという...
私?VC4 で挫折しましたorz


一応、「解決済み」に。
解決済み
引用返信 編集キー/
■3919 / inTopicNo.22)  Re[5]: MFC マルチスレッドについて
□投稿者/ とっちゃん (139回)-(2007/05/28(Mon) 22:52:34)
とっちゃん さんの Web サイト
No3916 (Jitta さん) に返信

>>てことは、スレッド待ち合わせの間に何度でも「メッセージマップされた関数」に入ってくる可能性がありませんか?
> コントロールを disable にしているので、それはありません。
> 一応、待ち合わせ中にアクションを起こし、入ってこないことを確認しています。
>
ESCキーとか、Alt+F4とかもチェックしました?
たまーにわすれて...ということが(ええ、経験者ですがなにか?w)

>
>>「ナニがしたいのか」を把握して、書き直しちゃった方が早いんじゃないすか?
> ひとつの障害は、MFC でアプリケーションを作れる人がいないという...
> 私?VC4 で挫折しましたorz
>
一番大きな障害かとw

とはいえ、実際のところ、MFC がというより、Native でのお作法は?
という部分が殆どだと思います。

該当部分だけでいえば、MFC なら、_beginthread/_beginthreadex の代わりに AfxBeginThread つかってればOKなところですしw
あとは、ほとんどメッセージはどうとか?HWND とスレッドの関係とか全くMFC関係なしの部分だしw

メッセージポンプも、同期オブジェクトとかうまいこと使えば、
MsgWaitForMultipleObjects で回せます。<段取りは完全に組み直しですがw

解決済み
引用返信 編集キー/
■3922 / inTopicNo.23)  Re[6]: MFC マルチスレッドについて
□投稿者/ Jitta (345回)-(2007/05/29(Tue) 07:28:31)
No3919 (とっちゃん さん) に返信
> ESCキーとか、Alt+F4とかもチェックしました?
> たまーにわすれて...ということが(ええ、経験者ですがなにか?w)

むはっ!
まぁ、一個のメッセージしか入ってこないですわ。他に回される処理と、どう整合させているか、よくわかんないけど。


>>ひとつの障害は、MFC でアプリケーションを作れる人がいないという...
>>私?VC4 で挫折しましたorz
>>
> 一番大きな障害かとw
>
> とはいえ、実際のところ、MFC がというより、Native でのお作法は?
> という部分が殆どだと思います。

では、「Windowsプログラミングの経験者」にします。
C++ Builder って、その意味では VB とかわりませんから
解決済み
引用返信 編集キー/
■3933 / inTopicNo.24)  Re[7]: MFC マルチスレッドについて
□投稿者/ とっちゃん (140回)-(2007/05/29(Tue) 11:51:51)
とっちゃん さんの Web サイト
No3922 (Jitta さん) に返信
>>ESCキーとか、Alt+F4とかもチェックしました?
>>たまーにわすれて...ということが(ええ、経験者ですがなにか?w)
>
> むはっ!
> まぁ、一個のメッセージしか入ってこないですわ。他に回される処理と、どう整合させているか、よくわかんないけど。
>
DoModal() してるなら、IDCANCELのボタンを無効化するだけでOKだったはずだけど...
最近はどうなんだ?よくわからんw

IDOK/IDCANCEL は特殊な作りになってるので、この二つのボタンを無効化させることで
ウィンドウは閉じなくなったはず...<MFC

基本的には、ボタンコントロールほかユーザー入力を受け付けるコントロールは全部無効化。
それ以外も、フィードバックをしないものは無効化というのが一番いいかな?

なんだかんだと一番楽なのは、モーダルダイアログ(もどきでもよい)を出してしまうなんですけどねw

>>とはいえ、実際のところ、MFC がというより、Native でのお作法は?
>>という部分が殆どだと思います。
>
> では、「Windowsプログラミングの経験者」にします。
> C++ Builder って、その意味では VB とかわりませんから

スレッド周りは複雑に見えますが、HWND に投げたメッセージはどういう投げ方をしても
かならずそのウィンドウを作成したスレッドでメッセージが処理される。
ということを覚えておけば、あとは、なるべく互いがしらんぷりを
決め込んでおくことでなんとかなります。

難しいのは同じアドレス上のオブジェクトを操作する場合の同期(どういう同期手法をとるか?)
と、スレッドを安全に終了させる段取りですね(TerminateThread は何があってもNGw)。

今度、Codezineあたりにでも投稿するかなw<小遣い稼ぎにww

解決済み
引用返信 編集キー/
■3935 / inTopicNo.25)  Re[8]: MFC マルチスレッドについて
□投稿者/ 渋木宏明(ひどり) (219回)-(2007/05/29(Tue) 12:54:33)
渋木宏明(ひどり) さんの Web サイト
> IDOK/IDCANCEL は特殊な作りになってるので、この二つのボタンを無効化させることで
> ウィンドウは閉じなくなったはず...<MFC

ダイアログの「×(閉じる)」ボタンは、結果的に IDCANCEL 投げてない?
CDialog::OnOK(), CDialog::OnCancel() をオーバーライドして、条件判定やってるな>自分

引用返信 編集キー/
■3936 / inTopicNo.26)  Re[5]: MFC マルチスレッドについて
□投稿者/ 渋木宏明(ひどり) (220回)-(2007/05/29(Tue) 13:01:10)
渋木宏明(ひどり) さんの Web サイト
>>volatile じゃん?
> これだぁ!!
> 「メニィ コアで、別々の値参照されたらダメちゃうん?」と思っていたんだけど、
> 別々の値を参照することになる原因、レジスタに乗っかるのがダメなんだ。

んー、VC はよほど自信がないとレジスタに乗っけるコード吐かった様な気がするんだけどなぁ。

>>てことは、スレッド待ち合わせの間に何度でも「メッセージマップされた関数」に入ってくる可能性がありませんか?
> コントロールを disable にしているので、それはありません。
> 一応、待ち合わせ中にアクションを起こし、入ってこないことを確認しています。

えー、とするとこのコーディングはちょっと納得できないな。
待ち合わせのためにポンプ回すくらいなら、ボタンハンドラなんか抜けてしまって、スレッドの方から終了を通知するワーカメッセージを投げてもらうようにすればいいのに。

>>「ナニがしたいのか」を把握して、書き直しちゃった方が早いんじゃないすか?
> ひとつの障害は、MFC でアプリケーションを作れる人がいないという...
> 私?VC4 で挫折しましたorz

食わず嫌いなんじゃ (^^;

引用返信 編集キー/
■3940 / inTopicNo.27)  Re[9]: MFC マルチスレッドについて
□投稿者/ とっちゃん (142回)-(2007/05/29(Tue) 13:58:19)
とっちゃん さんの Web サイト
No3935 (渋木宏明(ひどり) さん) に返信

> ダイアログの「×(閉じる)」ボタンは、結果的に IDCANCEL 投げてない?
> CDialog::OnOK(), CDialog::OnCancel() をオーバーライドして、条件判定やってるな>自分
>
VC6 からだったかな? OnOK/OnCancel の実装が変って、ボタン無効化でメッセージがブロックされるように変わったですよ。
何だかんだと、ちまちまと変更されてるw

でも、条件判定入れておく方が安全。どこから飛んでくるか分からないしね。
あとは、不用意にEndDialogさえ呼んでなければw

> えー、とするとこのコーディングはちょっと納得できないな。
多分、元々シングルスレッドだったものを付け焼き刃的にマルチスレッド化したものだと思われます。

ループそのものの中身をスレッド化して...という奴ではないかと。
なので、詳細設計はそのままにというコードの様な気がします。


引用返信 編集キー/
■3944 / inTopicNo.28)  Re[10]: MFC マルチスレッドについて
□投稿者/ 渋木宏明(ひどり) (222回)-(2007/05/29(Tue) 15:27:56)
渋木宏明(ひどり) さんの Web サイト

>>えー、とするとこのコーディングはちょっと納得できないな。
> 多分、元々シングルスレッドだったものを付け焼き刃的にマルチスレッド化したものだと思われます。
>
> ループそのものの中身をスレッド化して...という奴ではないかと。
> なので、詳細設計はそのままにというコードの様な気がします。

この手の書き方で不安なのは、この DoEvents してる間に終了操作されちゃったらどうすんの?ってやつ。
引用返信 編集キー/
■3945 / inTopicNo.29)  Re[11]: MFC マルチスレッドについて
□投稿者/ とっちゃん (143回)-(2007/05/29(Tue) 16:38:58)
とっちゃん さんの Web サイト
No3944 (渋木宏明(ひどり) さん) に返信
>
>>ループそのものの中身をスレッド化して...という奴ではないかと。
>>なので、詳細設計はそのままにというコードの様な気がします。
>
> この手の書き方で不安なのは、この DoEvents してる間に終了操作されちゃったらどうすんの?ってやつ。

「今回に関して」であれば、最初のダイアログが閉じなければ大丈夫だとは思いますが、
それとてかなり運用依存な部分は有りそうですね。

放置してる間に、WindowsUpdate が入って、リブートします〜とか言われてしまったら...とかw
スリープ移行も危ない気がしますが、そちらはまぁ目をつぶるとしても、
プライマリ側からスレッドを速やかにおらわせる仕組みがない感じがするので
そのあたりは非常に危険な気がします。

もっとも、UDPで...という部分をWindowsのソケット(バークレー互換ではない方)にすれば
スレッド起こさなくてもいいんじゃないか?という気がしなくもないと言うのはあります。

昔、C/S 型の社内簡易メッセンジャーシステム書いた時にちょこっと触った程度の知識だから
詳しくはねーですが、UDPでも、メッセージベースで非同期通信はできたと思う。

引用返信 編集キー/
■3947 / inTopicNo.30)  Re[6]: MFC マルチスレッドについて
□投稿者/ Jitta (347回)-(2007/05/29(Tue) 18:19:32)
No3936 (渋木宏明(ひどり) さん) に返信

> えー、とするとこのコーディングはちょっと納得できないな。
> 待ち合わせのためにポンプ回すくらいなら、ボタンハンドラなんか抜けてしまって、スレッドの方から終了を通知するワーカメッセージを投げてもらうようにすればいいのに。

激しく同感
というか、ほぼ同じ処理が3つあるのですが、全部別々にコーティングしてある時点でブー!
で、実装が微妙に違う…(_ _ )


> 食わず嫌いなんじゃ (^^;
>

ど、どりょくしてます(;・д・)
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -