ふらっと C#,C♯,C#(初心者用) Part138

■ このスレッドは過去ログ倉庫に格納されています
2018/06/05(火) 19:32:42.28ID:70UTtyrn0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part137
https://mevius.5ch.net/test/read.cgi/tech/1523004019/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/07/19(木) 16:13:58.11ID:GVBKISLp0
共有メモリにFIFO作りたいのでサンプルコードください
2018/07/19(木) 19:27:54.48ID:FFg3mKaqa
>>737
基本的にスレチだな
2018/07/19(木) 20:33:54.32ID:AM4tPqCx0
>>737
マルチ乙
2018/07/19(木) 20:34:49.77ID:m5MPu7YPM
バックグラウンドジョブをメモリに置いて管理するとクラッシュした時につらいのでやめてください
741デフォルトの名無しさん (ササクッテロル Sp4b-zvcE)
垢版 |
2018/07/19(木) 23:06:52.57ID:afTcWGfVp
>>736
少なくとも送る側が待てばたまらないし、待たすからには大元まで遡って待たせることが出来る。
受け側で貯めちゃうと、そんなコントロールすらできない。
2018/07/19(木) 23:10:07.57ID:3HXgvZll0
>>737
MemoryMappedFileクラスで共有メモリを作って、そこにリングバッファを作れば良い。
サンプルコード? と言う名の丸投げは知らんw
2018/07/19(木) 23:16:09.86ID:GVBKISLp0
>>742
ありがとうございます
2018/07/19(木) 23:24:45.38ID:OO5CyzUia
>>741
何を言ってんの。
ちゃんと自分の頭で考えて言ってる?

キューの容量が100だとする。
リクエストが100まで溜まってしまうかどうかは、キューをどちらが持つかと関係ないでしょ。

スループットはリクエストの処理能力で決まるんであって、キューをどっちが持つかで決まるんじゃない。
当たり前でしょ。

送る側が待てばたまらない?
それは受ける側がリクエスト拒否したらたまらないと言ってるのと同じ

君の世界じゃ、バケツリレーの余分なバケツの置き場所を送り元におくか送り先に置くかで
バケツの輸送能力(単位時間あたりの送れる水の量)が変わるの?

変わるわけがないでしょ
頼むよマジで
2018/07/20(金) 00:04:31.35ID:K42rKqTp0
>>721
ありがとうございます

すみません、コンポジションというのはどういう手法なのでしょうか?
調べてはみたのですが解説しているサイトが見つからなくて・・・
2018/07/20(金) 00:15:51.43ID:v/t2rOLx0
>>745
クラスのインスタンスをメンバ変数などに設定して持つ
2018/07/20(金) 00:16:43.45ID:Cn0RK5hEM
配置計画
GOFはそちらを優先して説明しているが
2018/07/20(金) 01:07:34.53ID:AsTO3swr0
持つと待つ
混ざりすぎじゃねぇの?
待つって言いたいんだよね?
2018/07/20(金) 06:49:01.24ID:rjUp7fMrM
きたです
https://i.imgur.com/F20EZn1.jpg
2018/07/20(金) 09:57:40.63ID:KW0DEJnu0
>>748
>>744の文中の持つは持つで間違ってないと思う
751デフォルトの名無しさん (ササクッテロル Sp4b-zvcE)
垢版 |
2018/07/20(金) 10:43:27.30ID:aSukBuZjp
>>744
だから、貯め無い様にするには、送る側、更にそこに送る側、更に大元の送る行為を辞めされはいいって話。
わかる?

通信のフローコントロールの話と同じなんだよ?
2018/07/20(金) 10:47:52.01ID:j2kgPlBya
>>751
まだ言ってるのか。

君の世界では
>送る側、更にそこに送る側、更に大元の送る行為を辞めされはいいって話

これが可能かどうかはリクエストのキューをどちらが持つかに依存するのか。
キューをリクエストの受け側が持ったらそれは出来ないのか。
意味が分からないよ

何が
>通信のフローコントロールの話と同じなんだよ?
だw
馬鹿過ぎて笑える
2018/07/20(金) 10:50:07.22ID:GHEf7JCUM
よそでやってくんねーかなクソカス
754デフォルトの名無しさん (ササクッテロル Sp4b-zvcE)
垢版 |
2018/07/20(金) 10:50:53.38ID:aSukBuZjp
おまえ、目悪過ぎて呆れるわ。

持つなんて一言も言って無いだろw
待つだw マツ。

キューをどっちが持ってるかなんて話はしてない。
2018/07/20(金) 11:06:39.88ID:KI/QuNIvM
アスペルガーの人はひとつのことしか同時にわからないから
二つ話題があることに気がつかない

その話題は持つであってるよ
756デフォルトの名無しさん (ササクッテロル Sp4b-zvcE)
垢版 |
2018/07/20(金) 11:16:02.27ID:aSukBuZjp
>>755
まあ普通は受け取る側に郵便受けが無いと受け取る人はいちいち局留めの郵便を受け取りに行かなきゃならないんだけど、まあ、それはどちらでも機能するからあんまり争点にはならないけどね。
2018/07/20(金) 13:07:56.71ID:aSN8UD58d
バケツリレーの喩えでもスループットは変わっちゃうんだよな。
受け側に送信側が送信する総量より大きいバッファを持てば、スループットは水の入ったバケツを運ぶ時間に依存するだけで済む。
キューがそれより遅ければバケツを引き渡すために時間が余計にかかるわけだから、スループットは落ちる。
送信側にキューを持ったところで、送信側は送信処理に対して同期的に処理しないだけで済むだけで、そのキューからの送出がどんどん遅れるだろう。受け取ってくれないなら。
2018/07/20(金) 13:54:59.01ID:gB9GbXMP0
>>693,695「スレッドを協調して動かしたいです、制約あるんで」
凡人の回答「○○使えよ」
天才の回答「制約が悪い」
2018/07/20(金) 21:28:53.81ID:OAXfUTo30
c=(a*a+b*b)
c=System.Math.Sprt(c)
これでcの平方根を出そうとしたのですがSystem.MathにSprtの定義がありませんと出ます
sharedevelopを使っています
2018/07/20(金) 21:32:35.58ID:XkM+nwLwM
SQRT
2018/07/20(金) 21:35:00.80ID:6RzmSKAyM
エディタの不具合だろ
SharpDevelopなどという化石は今すぐアンインストールしてVSかVSCodeを使え
2018/07/20(金) 21:44:14.53ID:XkM+nwLwM
平方根の綴りが違う
2018/07/20(金) 22:17:34.54ID:7jIkQpVM0
square rootだからねぇ
2018/07/21(土) 00:28:32.93ID:WdWG9X6t0
ありがとうございます 解決しました
2018/07/21(土) 06:52:38.43ID:HGZKU0EK0
スパート!
2018/07/21(土) 13:53:42.54ID:aw31/LTY0
>>754
もともと
>キューを持つべきなのはリクエストを送る側ではなく受ける側なんじゃないか、
にたいして
>送る側で待たないと仕事を溜め込んだ受け側が最悪死ぬか無視する様になるぞ。
ってレスしてるのが発端なんだが

どうでもいい良いしよそでやって欲しいけど
767デフォルトの名無しさん (ワッチョイ 97b5-zvcE)
垢版 |
2018/07/21(土) 14:14:10.21ID:IqGIA9LU0
話題が一変してんのにわざわざ掘り返すなよw
言ってる事とやってる事が矛盾してんぞw
2018/07/21(土) 15:42:07.60ID:8fBGWCJL0
レスバトルって奴だろ
最後に言及した方が勝ちなんだって
これ見るといつも思うが、こういう馬鹿には自分自身を見る自意識がないのかね
769デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/21(土) 20:00:10.16ID:rsQP0F780
たすけて!
Parallel.ForEachの中でデータグリッドの内容を更新してるんだけど
途中で爆発します
データグリッド全体に✕って出て非表示になる
データグリッドの更新処理はlockで囲ってても競合は起きちゃうものですか?
2018/07/21(土) 20:05:25.49ID:CBiNHREt0
まず原因を切り分けろ
Parallel.ForEachを外しても爆発するか確認するんだ
771デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/21(土) 20:07:27.16ID:rsQP0F780
>>770
パラレルの外出すと機能するけど
そうすると全処理終わってから一回しか更新されない…😌
2018/07/21(土) 20:08:57.28ID:gktKld7A0
>>771
UIはUIスレッドからしか操作出来ない
Parallel.ForEachの処理は別スレッドで実行される
2018/07/21(土) 20:10:43.13ID:BEEMYUE30
>>771
Action<TLocal> localFinally の引数をとるオーバーロードを使ってみたらどうでしょう?
2018/07/21(土) 20:10:44.76ID:H6KFndt4M
>>768
君のレスを見るといつも思うが、こういう特徴のある口調のレスを繰り返す人には自分自身を見る自意識がないのかね
2018/07/21(土) 20:10:59.84ID:nH897ECr0
invokeするか、ContextにPostするしか無いんじゃないかな
2018/07/21(土) 20:22:09.68ID:3bWsh9tI0
>>774
>>774
2018/07/21(土) 20:22:10.55ID://qCwfF7a
爆発w
778デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/21(土) 20:24:00.77ID:rsQP0F780
>>772
>>773
>>775
Invokeでググりました
まさにこの疑問を解決するための機能でした
有難う御座います
2018/07/21(土) 20:35:04.73ID:BEEMYUE30
私は >>773 ですが Invoke について自分があまり良く分かってない気がしてきたので
詳しい方がいらっしゃったら教えてください

UIスレッドで Parallel.ForEach を呼ぶとUIスレッドをつかんだまま並列処理が実行されて、
その並列処理のスレッドで Invoke を使うとデッドロックしてしまう気がするのですが
実際はそういうことはないのでしょうか?
2018/07/21(土) 20:36:04.76ID:aw31/LTY0
マルチスレッドにしてInvokeしまくると結局パフォーマンスがガタ落ちしたりするがな
2018/07/21(土) 21:15:58.91ID:BEEMYUE30
>>779 です
WPF で下のようなコードを実行してみたらやっぱりデッドロックしてしまいました
Invoke はそれなりに慎重に使わないといけないみたいです

void Button_Click(object sender, RoutedEventArgs e)
{
  MessageBox.Show("このメッセージは必ず表示される");
  Parallel.ForEach(Enumerable.Repeat(0, 2), i => Dispatcher.Invoke(() => { }));
  MessageBox.Show("デッドロックするとこのメッセージは表示されない");
}

ちなみに Enumerable.Repeat(0, 2) の部分を変えると以下のような挙動でした

Enumerable.Repeat(0, 0) に変える → デッドロックしない
Enumerable.Repeat(0, 1) に変える → デッドロックする
new int[] { } に変える → デッドロックしない
new int[] { 0 } に変える → デッドロックしない
new int[] { 0, 0 } に変える → デッドロックする
2018/07/21(土) 21:16:52.59ID:1oayVCQs0
>>778
いいってことよ(´・ω・`)b
2018/07/21(土) 21:18:17.40ID:nH897ECr0
>>779
並列処理はUIスレッドではないスレッドで行われるよ。
いや、UIスレッドで行われるとは限らない、と言う言い方の方が正しいかな。
UIスレッドを掴んだままの意味がわからんが、挙動が謎なら、ブレークポイントつけて実行して、どのスレッドが何をしてるかを把握してはいかがだろうか。
今どのスレッドを使ってるかは表示されてるから。
2018/07/21(土) 21:20:54.98ID:nH897ECr0
WPFかあ
785デフォルトの名無しさん (ワッチョイ 7feb-yhN8)
垢版 |
2018/07/21(土) 21:25:21.58ID:VW1YO4fA0
Windows版VSCodeで、monoを構文解析用のコンパイラとして指定することってできないのかな?

Unityの.Net4.0用プロジェクトで、数ヶ月前までは、.Net3.5用のSystem.Data.DLLを読み込んでくれたのにさあ
VisualStudioを更新したら構文解析用のコンパイラが変わったのか、古い.net3.5用のDLLを読み込んでくれなくて赤波線だらけになっちゃったぜ
4.0用のDLLもあるわけだけど、それを入れるとUnityのmonoの方でなぜかエラーを起こすし・・・どうしたら良いものか・・・・
2018/07/21(土) 21:33:11.65ID:BEEMYUE30
>>783-784
レスありがとうございます

> いや、UIスレッドで行われるとは限らない、と言う言い方の方が正しいかな。
>>781 で new int[] { 0 } だとデッドロックしないあたり、まさにそんな感じですね

> WPFかあ
>>769 でデータグリッドと書かれていたので、
今の Windows フォームなら DataGrid ではなく DataGridView かなと思って
WPF の方で試してしまいました(汗
Windows フォームだと挙動が変わるならそれも知っておきたいので
今からそっちでも試してみます
2018/07/21(土) 21:36:50.95ID:BEEMYUE30
Windows フォームで試してみたのでご報告を。
以下のコードを実行してみた結果、やっぱりデッドロックしてしまいました
Enumerable.Repeat(0, 2) を変えたときの挙動も >>781 と同じでした

void button1_Click(object sender, EventArgs e)
{
  MessageBox.Show("このメッセージは必ず表示される");
  Parallel.ForEach(Enumerable.Repeat(0, 2), i => Invoke(new Action(() => { })));
  MessageBox.Show("デッドロックするとこのメッセージは表示されない");
}
788デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/21(土) 22:26:34.46ID:rsQP0F780
えーわからん…
ちなみにフォームですビューです
つまりフォームアプリでParallel処理内でinvokeってそもそも悪手なんでしょうか
それともThread生成してその中でParallelすれば良かったり…?これはすごい破綻してる気がしますが

uiスレッドから切り離した他スレッドから安全にuiを制御するなんて考えが可笑しいんでしょうか
2018/07/21(土) 22:44:23.68ID:BEEMYUE30
>>788
あくまで私一人の考えですが・・・

[1] Invoke を使うと >>779 に書いたような理由でデッドロックするので
 Parallel.ForEach でUIスレッドを使いたいなら >>773 のようにすべき
[2] しかし、同じく >>779 に書いたように Parallel.ForEach はUIスレッドを
 つかんだまま並列処理を行うのでデータグリッドの更新処理だけ
 Parallel.ForEach から切り出してもほとんど同じなのでは?
 (一応 localFinally 中も他のスレッドは動けるので
   そこで更新処理を行う方がいい場合もあるかもしれない)
[3] 並列処理が必要なほど大きな処理を行うなら、
 一度UIスレッドを手放す選択肢も考えてみては?

ただ、Invoke がダメだと考えている人間自体が私だけのような気もするので
他の方の意見も聞いてみたほうがいいと思います
あと、[3] に関しては場合によりけりだと思うので、
具体的な処理内容を教えていただければ私の考えをお伝えしたいと思います
2018/07/21(土) 22:55:07.29ID:gktKld7A0
>>787
そのコードだと、button1_Click()がずっとUIスレッドを握ったまま。
だから、Parallelの別スレッドでInvoke()しようとしてもUIスレッドに遷移出来なくて固まる。
2018/07/21(土) 23:00:46.86ID:gktKld7A0
既に>>779に書いてあったね。その通り。
2018/07/21(土) 23:10:20.56ID:BEEMYUE30
>>790-791
レスありがとうございます
>>779 の考えで正しいのか不安だったのですがお陰様で自身が持てました
他に何かおかしなことを言ってしまっていたら教えていただけると嬉しいです

>>788
>>789 はレスとしてとっ散らかっている気がしてきたので一問一答で答えてみます

> つまりフォームアプリでParallel処理内でinvokeってそもそも悪手なんでしょうか
Parallel を UI スレッドで実行する場合は悪手というか、致命的だと思います

> それともThread生成してその中でParallelすれば良かったり…?これはすごい破綻してる気がしますが
それなら期待通りの動作にはなると思います。ただ、確かにあまりいい方法ではないと思います

> uiスレッドから切り離した他スレッドから安全にuiを制御するなんて考えが可笑しいんでしょうか
正しく Invoke を使えば問題ないと思います
しかし今回の件からもわかるように、Invoke を正しく使うのはなかなか難しいようです
2018/07/21(土) 23:21:21.79ID:R8KbBSh90
.Invokeではなく.BeginInvokeを使うのはどう?
2018/07/21(土) 23:30:54.97ID:BEEMYUE30
>>793
それって
> それともThread生成してその中でParallelすれば良かったり…?
よりも更にワチャワチャする気がするのですがどうなんでしょう?

ワチャワチャって具体的にどういうことなのか
説明を求められれば頑張ってみようと思いますが、
自分の考えがあっているかも、それをうまく説明できるかどうかも
自信がないので、詳しい方の意見を聞けると嬉しいです
2018/07/21(土) 23:41:01.32ID://qCwfF7a
>>794
そんな難しい話じゃないっすよw

BeginInvokeは非同期に実行される、つまりキューにデリゲートを入れたらすぐに処理を返すので
Invokeのように自分で自分の終了を待機する状態に陥らない
796デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/21(土) 23:43:41.94ID:rsQP0F780
>>792
有難う御座います
これで行けたので実装試してみます

void button1_Click(object sender, EventArgs e)
{
  MessageBox.Show("このメッセージは必ず表示される");
  Task.Factory.StartNew(() =>
  {
  Parallel.ForEach(Enumerable.Repeat(0, 2), i => Invoke(new Action(() => { })));
  }
  MessageBox.Show("デッドロックするとこのメッセージは表示されない");
}
2018/07/21(土) 23:55:52.12ID:BEEMYUE30
>>795
レスありがとうございます
おっしゃる通りBeginInvokeはキューにデリゲートを入れたらすぐに処理を返すので
次から次へとキューが入って大変なことになりそう・・・と思ったのですが、
そんなに心配することではないのでしょうか

>>796
それで一応動くと思いますが、Parallel.ForEach が終わる前に
二つ目の MessageBox.Show の行に移るので注意してください
・・・というか、localFinally を使ったり更新処理だけを切り出したりはダメっぽいですか?
ダメだと考えられた理由を教えていただければ何かアイディアを提供できるかもしれません
798デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 00:03:07.23ID:qjdpSLXF0
>>797
データグリッドビューは進捗状況を見るために更新していて
1行1スレッドで処理されて処理後にどう処理されたかをリアルタイム表示してます

ダメではなく単純に自分が分かってないだけです
この処理ならlocalFinallyが最適かもです
深く調べてみます
2018/07/22(日) 00:13:38.17ID:IU6x2eOV0
>>798
> データグリッドビューは進捗状況を見るために更新していて
> 1行1スレッドで処理されて処理後にどう処理されたかをリアルタイム表示してます
進捗状況の確認が必要なほど1行あたりの処理に時間がかかる理由は何でしょうか?
もしその理由が IO など、CPU 以外のところにあるのだとすれば、
Parallel.ForEach を使うこと自体を見直したほうがいいかもしれません

> この処理ならlocalFinallyが最適かもです
正直なところ、更新処理だけ切り出す方法よりも localFinally の方が
適切なケースはまれだと思います
ただ、localFinally の使い方がわかれば更新処理を Parallel.ForEach の外に
切り出す方法もわかると思うので、とりあえず調べてみて損はないと思います
800デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 00:23:24.78ID:qjdpSLXF0
>>799
圧縮ファイルを解凍して中のファイルを加工して再び圧縮し直す
これで1タスクです
1ファイル200MBほどで100ファイル以上処理することが多いです
圧縮解凍、加工は外部ツールを使用しててProcessStartInfoで処理されます
2018/07/22(日) 00:35:58.51ID:IU6x2eOV0
>>800
なるほど〜
CPU 処理も IO もあって微妙なところですね

ちなみにその外部ツールはマルチスレッドを使うオプションはないでしょうか?
(例えば 7-zip.exe だと -mmt がそれにあたります)
もし外部ツールがマルチスレッドに対応してるなら、
並列処理はそっちに任せてしまうというのはどうでしょう?

または、外部ツールではなく SharpCompress のようなライブラリを使うことができれば、
C# によるより細かい制御も可能になると思います
2018/07/22(日) 00:37:18.94ID:gDKcX53ba
汎用的なものとは思えないし、動けばどうでもいいだろ
俺ならそういうのはいちいちGUI付けずにコンソールでやっちゃうな
2018/07/22(日) 00:45:55.06ID:IU6x2eOV0
>>800
それともう一つ、外部ツールを呼び出すのにデフォルトの ParallelOptions で
Parallel.ForEach を呼び出すのはさすがにまずいと思います
ParallelOptions 自体に MaxDegreeOfParallelism というプロパティがありますし、
ParallelOptions の TaskScheduler プロパティに以下のような自前のスケジューラーを
設定すればより柔軟な並列処理を実現できると思います

同時実行の程度を制限するタスク スケジューラを作成する
https://msdn.microsoft.com/ja-jp/library/ee789351(v=vs.100).aspx

>>802
それは確かにw
完成したソフトによって得られる利益よりソフトを作るコストのほうが大きくなってしまったら
意味がないですからね
(ただしソフトによって得られる利益には開発者のスキルアップも含まれる・・・と言ってみたりw)
804デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 00:48:52.21ID:qjdpSLXF0
>>801
7zip使ってます
スレチになるけど
mmtは一つの処理をマルチに実行するものではないでしょうか

圧縮形式は決まってなく複数あるので7zipを使用してます
zip rar lzh以外にも色々
805デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 00:51:33.52ID:qjdpSLXF0
>>803
タスクスケジューラー調べてみます良さそうですね

i7使用しててMaxDegreeOfParallelismは常に8で実行してます
8スレッドで画面カッチカチで処理してます
暴力です
2018/07/22(日) 00:54:31.49ID:IU6x2eOV0
>>804
> mmtは一つの処理をマルチに実行するものではないでしょうか
その通りです
したいことが「進捗状況を表示できるようにすること」と「並列化により処理時間を短縮すること」
だとすれば、それで問題ない(というかむしろその方が望ましい)の思うのですがいかがでしょうか?
2018/07/22(日) 00:59:41.83ID:IU6x2eOV0
>>805
MaxDegreeOfParallelism を使ってらっしゃるなら
とりあえず致命的にまずいことはないと思います
ただ、CPU だけじゃなく、同時に8つのファイルの読み書きを
求められる HDD さんの気持ちも考えてあげて・・・w
808デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 01:01:31.55ID:qjdpSLXF0
>>806
後続の加工処理もありエラー監視も含むので進捗知りたいです
2018/07/22(日) 01:03:03.89ID:SZ8yn9810
>>798
localFinallyよりasync/awaitの方が分かりやすいと思う。

private async void button1_Click( object sender, EventArgs e )
{
MessageBox.Show( "このメッセージは必ず表示される" );
await Task.Run( () =>
{
Parallel.ForEach( Enumerable.Repeat( 0, 2 ), i => Invoke( new Action( () => { } ) ) );
} );
MessageBox.Show( "デッドロックするとこのメッセージは表示されない" );
}
2018/07/22(日) 01:04:00.97ID:gDKcX53ba
makefile使えば?
数行のMakefile書いて make -j8 するだけだよ
811デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 01:04:22.38ID:qjdpSLXF0
>>807
解答先は8GBのRamディスクです
メモリに物理ファイルおいてでここで加工して再圧縮してその後HDDに移動させてます
2018/07/22(日) 01:18:41.37ID:IU6x2eOV0
>>808
Parallel.ForEach を使わなくてもそれはできると思うのですがいかがでしょうか?

>>809
確かにおっしゃる通りですね
後は好みの問題ですが、やはり私は1行ごとに Invoke するよりも
パフォーマンス的に有利な localFinally や更新処理の切り出しを推したいですw

>>811
なるほど!そうすれば外部ツールを使っても HDD へのアクセスだけ別に処理できますね
ただ、HDD へのアクセスを別にしようという意識をお持ちで、それだけのスキルもあるのなら、
外部ツールにこだわる必要はないのでは・・・という気もします
あと、メモリは HDD よりはずっと速いですが、CPU キャッシュとかの関係でやっぱり
8 個のファイルを同時に読み出すよりは1つずつの方が良いような気がします
2018/07/22(日) 01:27:28.49ID:IU6x2eOV0
>>809 >>812
いや、でも進捗状況を表示するとなると結局どこかで await は使うことになりそうですね
ただ私としては >>800 のような処理なら Parallel.ForEach は必要ないと考えていて、

foreach (ファイルのループ)
{
  foreach (進捗状況のループ)
  {
    await (進捗状況の更新待ち);
    (進捗状況を画面に反映);
  }
  (1ファイルの完了を画面に反映);
}

のような感じで十分だと思うのですが、どんなもんでしょうか?
2018/07/22(日) 01:35:51.92ID:eU7Qw5rc0
そんな処理速度気にするなら複数PC用意できたりしないのかな?
たぶん内製ツールだと思うけど、そういうのって長期保守とかしないならシンプルでさくっとやれる方向を模索したほうがいい気が…
研究開発兼ねてとかだったらいいんだけど
815デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 01:43:37.75ID:qjdpSLXF0
>>812
そうです、最も投げやすく勝手にマルチしてくれる便利なParallelさんって聞いて使ってるます
別の手段があればコレに拘ることはないと思ってます

>>813
cpuキャッシュとか考慮せずマルチ=高速って誤認識で走ってきて
その中で最適化してきたので
localfinally使用したときと
1ファイルの処理の差も検証してみたいと思います

>>814
ただの趣味なんですPC一台で
複雑でも効果があれば試したいと考えています
816デフォルトの名無しさん (ワッチョイ ffe8-U/lW)
垢版 |
2018/07/22(日) 01:44:34.84ID:qjdpSLXF0
ほな寝ます。詳しくありがとうございました!
もしかしたら明日もっとやべーかもです
2018/07/22(日) 01:59:21.48ID:J1Nh86LOM
var block = new ActionBlock<ZipOpParam>(
async (param) => {
await ExecuteZipOpAsync(param);
InvokeUpdateUi(param);
},
new ExecutionDataflowBlockOptions {
MaxDegreeOfParallelism = 8
});

foreach(var p in zipOpParams)
block.Post(p);

block.Complete();
await block.Completion;
2018/07/22(日) 03:07:13.11ID:IU6x2eOV0
>>815
> そうです、最も投げやすく勝手にマルチしてくれる便利なParallelさんって聞いて使ってるます
これは私も同じように認識しています

> cpuキャッシュとか考慮せずマルチ=高速って誤認識で走ってきて
これは場合によりけりだと思います
特に今回のように外部ツール側でマルチスレッドにできる場合はツールの呼び出し側では
余計なことをせず外部ツールに任せたほうが高速になる場合が多いと思います


>>817
C# で並列処理を行うならこれは一つの解決策になりそうですね
別の解決策として、新たに参照を追加する必要のない↓の方法とかどうでしょう?

var tasks = new List<Task>();
foreach (var param in zipOpParams)
{
  if (tasks.Count == 8) tasks.Remove(await Task.WhenAny(tasks));
  tasks.Add(ExecuteZipOpAsync(param).ContinueWith(
    _ => InvokeUpdateUi(param),
    TaskScheduler.FromCurrentSynchronizationContext()));
}
await Task.WhenAll(tasks);
2018/07/22(日) 09:28:10.63ID:e8tLYzcQ0
違うexeキックすれば終わりなんやで?
2018/07/22(日) 13:48:56.26ID:dLVAOvzX0
オブジェクト指向について勉強しようと思い、クラスを複数作って実行しようとしたら実行ボタンがプロセスにアタッチというよく分からない物に代わりビルドなども出来なくなってしまいました
どうしたら元に戻せるでしょうか
2018/07/22(日) 15:37:48.37ID:X/YKRg9/M
参考にした資料がそう(実行ボタンをプロセスにアタッチ)しろと書いているなら
その手法でトラブった時の解決法も資料に書いてあるのでは

提示されたくらいの情報でここで帰ってくる答えは
「ゴミは捨てて作り直せ」
「一旦オブジェクト指向についての記憶を消せ」
だと思う
2018/07/22(日) 19:34:11.94ID:dLVAOvzX0
このように実行ボタンがアタッチ…となりビルドも行えなくなってしまっています…
プログラムは「確かな力が身に付くc#超入門」から取っていて特にプロセスにアタッチに関する記述も無いので恐らく設定どこか変に弄ってしまったのかと思うのですが…
https://i.imgur.com/QK8r2yI.jpg
2018/07/22(日) 19:59:19.28ID:zgYMpfBL0
>>822
ソリューションエクスプローラーで当該プロジェクトを右クリック→スタートアッププロジェクトに設定(みたいなやつ)を選択
2018/07/22(日) 20:02:21.74ID:2+gJNW3/0
>>822
言語じゃなくVisual Studioのスレで聞かないと
それはプロジェクトが読み込まれておらずソースだけ読み込まれている状態
2018/07/22(日) 20:13:04.82ID:dLVAOvzX0
>>823
やってみたのですがそれらしき項目がありませんでした…
2018/07/22(日) 20:13:36.52ID:dLVAOvzX0
>>824
なるほどありがとうございます vsのスレで聞いてきます
827デフォルトの名無しさん (ワッチョイ ff81-5o+W)
垢版 |
2018/07/23(月) 00:19:07.43ID:glq8mOZ10
revertしろや。意味もわからんだろうがな。
2018/07/23(月) 01:08:12.51ID:7plYbgct0
>>827
じゃあなぜそれを言ったのでしょうか…
2018/07/23(月) 02:22:37.56ID:UcAZ2Awl0
ナチュラルマウンティング
830デフォルトの名無しさん (ブーイモ MM7b-5o+W)
垢版 |
2018/07/23(月) 09:39:14.18ID:GAsLkYgIM
>>828
ググって勉強しろということだ
2018/07/24(火) 22:19:33.23ID:KA6Loe2t0
もしかしてASP.NETってJavaみたいなリッチで無料の拡張フレームワーク無いの?
2018/07/24(火) 22:26:36.90ID:9BkrBjXcd
>>831

ASP.NET自体が無料のフレームワークだろ
2018/07/25(水) 13:43:12.86ID:rJjy6ITv0
きもは「リッチ」で「拡張」ってことだろ
つまりどんなものを指してるのか全く分からんがな
2018/07/25(水) 14:20:20.79ID:HwnrNSAwM
Classic ASP.NETは拡張性とかガン無視でMSがデフォルトで提供するお仕着せのものだけ覚りゃ一通りできるっていうドカタ向けフレームワークだぞ
Springみたいなのがお好みならASP.NET Core使え
2018/07/25(水) 17:37:41.34ID:rJjy6ITv0
>>834
Classic ASP.NETがどのバージョンを指してるか知らんが拡張性無視とか笑わせる
HTTPハンドラとかモジュールとか自作したらほぼすべてカスタムできたわけだが
2018/07/25(水) 22:02:27.35ID:LjfK0h7i0
すれ違いで書き込んだ者ですが、こういう連続線をC♯を使って、方眼風の画面にクリックして一番近い座標点から始まり次のクリック座標点って感じで連続線を描きたいんですが、なんか参考になる本だとかサイトってありませんか?
https://i.imgur.com/Emj85bk.jpg
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況