トップページ > プログラム > 2015年12月26日 > E3MIEZFa

書き込み順位&時間帯一覧

7 位/187 ID中時間01234567891011121314151617181920212223Total
書き込み数00000000000022400101000010



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part121 [無断転載禁止]©2ch.net
Win32API質問箱 Build121 [転載禁止]©2ch.net
オブジェクト指向は愚かな考え。この世は計算式 ★2 [無断転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part121 [無断転載禁止]©2ch.net
451 :デフォルトの名無しさん[sage]:2015/12/26(土) 12:40:06.70 ID:E3MIEZFa
const shared_ptr<T>& ref っていう参照じゃなくて、shared_ptr<T> ptr っていう実態で
受ければ良いだけなんじゃないの?
これなら追尾してくれるよね

第一、const shared_ptr<T>& ref って何でconst付けているか意味不明なんだが
これって、Tの実態を書き換えないって意味じゃなくて
Tは書き換えられるけどshared_ptr自体は書き換えないって意味だよね
ポインタで言ったら int * const p と同じ意味だよね
そんなことする意味有るの?
C++相談室 part121 [無断転載禁止]©2ch.net
454 :デフォルトの名無しさん[sage]:2015/12/26(土) 12:57:59.25 ID:E3MIEZFa
追尾っつーかさ、shared_ptr<T> ptr = list[0]って書き方にすると
vectorに入っているスマポへの参照としては追尾しないけど
Tの実際の方へのリンクは貼られたままになるでしょ
それで十分なんじゃないの?

list[0]そのものへの参照が欲しいってことなのかもしれんが
そんな機会はあまりないし、そもそも元のコードは
const shared_ptr<T>& refってconst付きで受け取っているから
参照を通してスマポの値を書き換えることは出来ないし、目的がよく分からんよね

それにlist[0]への参照がほしいならインデックスを取得しておけば済むよね
C++相談室 part121 [無断転載禁止]©2ch.net
456 :デフォルトの名無しさん[sage]:2015/12/26(土) 13:03:51.19 ID:E3MIEZFa
>>453
それだと生参照になるだろ
shared_ptr<T> ptrで受けるのが安全かと

しかし元のコードは const shared_ptr<T>& ref = list[0]; なので、
彼のしたいことは、list[0]のスマポの値が書き換わったら
それがrefにも反映されてほしい、ってことなのかもしれない
list[0]その物への参照がほしいということなのかもしれない
const T & や shared_ptr<T> で受けると実態にリンクされるから
list[0] が書き換わってもそれは反映されない

元のコードとコンパチにしつつバグを取るには
インデックスを使ってアクセスするのが一番手軽だろう
C++相談室 part121 [無断転載禁止]©2ch.net
457 :デフォルトの名無しさん[sage]:2015/12/26(土) 13:19:03.99 ID:E3MIEZFa
もしくはvectorは並べ替えされることも有って
そのたびにインデックスを更新するのが面倒くさいなら
std::vector< std::shared_ptr<T> * > list;とでもしておいて
auto ptr = list[0];
とでもするかだな
それが
std::vector< std::shared_ptr< std::shared_ptr<T> > > list
とかね
インデックスのほうが楽だと思うけどな

どちらにせよ、彼が const shared_ptr<T>& ref に何を求めているのか謎だから
これ以上は無意味だね
単にshared_ptr<T>で受けるだけで十分な案件かもしれないしな
Win32API質問箱 Build121 [転載禁止]©2ch.net
907 :デフォルトの名無しさん[sage]:2015/12/26(土) 14:09:13.88 ID:E3MIEZFa
質問します
実行するのに長い時間のかかる関数があります
呼び出すと処理が終わるまで帰ってこず、途中で中断するような仕組みも用意されていません
この関数はソースがない外部のものなので修正はできません
この関数を呼び出すとUIが長い間固まるので、当然ワーカースレッドで実行します
ここまでは良いです

しかしユーザが中断ボタンを押した時は処理を中断させたいです
TerminateThreadでワーカースレッドを無理やり終了することは出来ます
若干メモリリークするでしょうが、頻度は多くないので諦めることすら検討しています

問題はクリティカルセクションです
マルチスレッドなのでクリティカルセクションを使っているわけですが
EnterしたままLeaveせずにスレッドが終了するとクリティカルセクションは未定義な状態になると書いてあります
https://msdn.microsoft.com/ja-jp/library/cc429095.aspx
最低でもクリティカルセクションだけはLeaveしてから終了しなければなりません

一つ考えたのは、長い時間のかかる関数を別プロセスで実行することです
キャンセルする場合はプロセスごと殺します
もっとうまい方法はないですか?

http://www.codeproject.com/Articles/71529/Exception-Injection-Throwing-an-Exception-in-Other
一応ここに答えのようなものが載っているのですが
Win32API質問箱 Build121 [転載禁止]©2ch.net
908 :デフォルトの名無しさん[sage]:2015/12/26(土) 14:17:19.97 ID:E3MIEZFa
どちらにせよ、
http://www.codeproject.com/Articles/71529/Exception-Injection-Throwing-an-Exception-in-Other
に書いてある方法でワーカースレッドに外から無理やり例外を発生させたとしても
今対象の長い時間のかかる関数の中がどうなっているかわかからないので難しいと思いました

長い時間のかかる関数が、C++の例外機構を使ってRAIIでクリティカルセクションを管理していれば
無理やり例外を発生させることでLeaveさせることが出来るかもしれませんが
そうじゃなかった場合、Leaveせずに関数を抜けることになります
もちろんメモリリークもしますでしょう

別プロセスで実行するしか他にやりようがないように思えてきましたが
何か良い案はありますでしょうか
Win32API質問箱 Build121 [転載禁止]©2ch.net
909 :デフォルトの名無しさん[sage]:2015/12/26(土) 14:21:43.20 ID:E3MIEZFa
>C++の例外機構を使ってRAIIで

この日本語はちょっとおかしいですね

例外機構を使うか、もしくはRAIIで

に訂正しておきます
Win32API質問箱 Build121 [転載禁止]©2ch.net
910 :デフォルトの名無しさん[sage]:2015/12/26(土) 14:29:31.38 ID:E3MIEZFa
世の中には処理に時間のかかる関数がゴマンとあると思います
それらが外部のライブラリで修正不可能な事も一般的なことだと思います
加えて、長く時間のかかる処理は、ユーザーは何時でもキャンセルできるのも普通なことと思います

皆さん一体どうしているんですか?

実はキャンセルしているように見えて、キャンセルしておらず、最後まで走っており
キャンセルした場合は、結果データを捨てているだけ、とかですか?
Win32API質問箱 Build121 [転載禁止]©2ch.net
917 :デフォルトの名無しさん[sage]:2015/12/26(土) 17:22:27.23 ID:E3MIEZFa
>>912
どっちと言われても両方だと思います

自分のプログラム側も自分を守るためにクリティカルセクションは使っていますが
こっちは自分のコードなので好きにできるので
>>908の方法でメインスレッドからワーカースレッドに無理やり例外を発生させる方法でも
なんとかなるので構わないんですけども

呼びだされ側の、時間のかかる関数側も、そっちはそっちで自分を守るために
クリティカルセクションなどを使っている可能性がありまして
ソースコードがないので実際にどういう実装になっているかは定かではないのですが・・・
勝手に想定外の例外を発生させて関数を巻き戻して上手く開放処理が走る
保証はないといった感じです
もし関数側が例外機構もRAIIも使わずにCスタイルでEnter/Leaveしていたら
>>908の方法で無理やり外から例外を発生させても意味無いですから

別プロセスで走らすしかなさそうですね
オブジェクト指向は愚かな考え。この世は計算式 ★2 [無断転載禁止]©2ch.net
768 :デフォルトの名無しさん[sage]:2015/12/26(土) 19:37:51.44 ID:E3MIEZFa
どちらにしても、動的型がどんどん静的型を取り込んでいる現状があるのにそれを無視してもな
静的型にメリットが無いなら、本来静的型がなくても動く動的型が
わざわざ静的型を取り込むわけ無いということぐらい直ぐにわかるのに


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。