- 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 - どちらにしても、動的型がどんどん静的型を取り込んでいる現状があるのにそれを無視してもな
静的型にメリットが無いなら、本来静的型がなくても動く動的型が わざわざ静的型を取り込むわけ無いということぐらい直ぐにわかるのに
|