X



ふらっと C#,C♯,C#(初心者用) Part134
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 0f9a-KsIq)
垢版 |
2017/11/29(水) 19:23:58.05ID:GNLsbK4F0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part133
http://mevius.5ch.net/test/read.cgi/tech/1510056685/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/

■コードを貼る場合は↓を使いましょう。
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
0427デフォルトの名無しさん (ワッチョイ bbeb-nOrU)
垢版 |
2018/01/09(火) 18:57:43.08ID:TMj71yN00
ありがとうございます
図はよくわからなかった点も多いので、ゆっくり記事を読んできます
0431デフォルトの名無しさん (アウアウエー Sa3f-iSeT)
垢版 |
2018/01/10(水) 01:37:54.23ID:9VtjyWrsa
↑の人はたぶんコードと図で1セットになってることに気付かずに
図だけ見てそう言ってるか、あるいはなんか思いっきり勘違いしてるだけだと思うから
安心して参考にしていいと思うw
0433デフォルトの名無しさん (アウアウウー Sa8f-aKZ8)
垢版 |
2018/01/10(水) 01:55:51.66ID:rjHbKDY9a
>「メソッドを一時中断し、awaitされた処理の完了を待って残りの処理を再開する」
非常にグレーな表現

>@に続けてAの処理が別スレッド上で開始される
非常にグレーな表現

HevyWork()の中身が必ずすべて別スレッド上で行われてるわけではない
0439デフォルトの名無しさん (ワッチョイ 9f7c-Ogju)
垢版 |
2018/01/10(水) 05:30:31.38ID:t7WvUySz0
UnityってC#どのくらい使えると触れるの?
0440デフォルトの名無しさん (ワッチョイ 0f80-41Gj)
垢版 |
2018/01/10(水) 07:12:09.78ID:8FRtzSYP0
初めてのJavaScript 第3版、オライリー、2017

JS には、async/await が無いから、
この本では、generator runner の仕組みを説明している。
co, Koa というライブラリを使う

非同期処理は異なるコンテキストで、
別のスレッド・プロセスだから、どこを実行しているのか分からない。
実行順番も制御できないし、例外処理も使えない

generator runner は非同期処理を、yield で待つように作る。
これにより、非同期処理を同期処理のコンテキストに当てはめるから、
実行順番を制御できるし、例外処理も使える

try{
yield promise 非同期処理
} catch {
}
0441440 (ワッチョイ 0f80-41Gj)
垢版 |
2018/01/10(水) 07:52:38.82ID:8FRtzSYP0
異なるコンテキストとは、同じソースコードに書いていても、
OS から見ると、別のプロセス・スレッド・実行単位になる

OS は、1秒間に数万回も、実行単位を切り替える(コンテキストスイッチ)から、
今、別の実行単位の、どのコードが実行されているかは、全く分からないし、制御もできない

別の実行単位に対してできることは、
タスクの終了を待つか、タイムアウトするか、タスクを止めてもらうかだけ
0446デフォルトの名無しさん (アウアウカー Sa4f-Sycn)
垢版 |
2018/01/10(水) 15:47:45.43ID:0NEBj+IAa
C#始めて1カ月程度の初心者です

trackbarの値をBackgroundWorkerに渡して、その値を使って別スレッドで画像を生成して、whileとReportProgressでtrackbarの変更に合わせて画像を表示していくプログラムを作っているんですが、

trackbarの値をBackgroundWorker_DoWorkに渡すのってどうやるんですか?

別スレッドなので、trackbar.Valueでそのまま使う事ができなくて…
デバッグ無しの実行ならよく分からないですが、そのまま使っても実行できて上手く画像表示されている事が確認できたので、
スレッド間でtrackbarの値を渡すのだけが上手くいかなくて悩んでます
0447デフォルトの名無しさん
垢版 |
2018/01/10(水) 15:54:42.58
トラックバーの値変更イベントのイベントハンドラでフォームのフィールドにトラックバーの値を保持しておく
それをバックグラウンドワーカーで読み取る
0448デフォルトの名無しさん (ガックシ 067f-Sycn)
垢版 |
2018/01/10(水) 16:15:46.81ID:+iIpBJgq6
>>447
それって両スレッド共通の変数を作っておいてトラックバーが動いた時のイベントハンドラでその変数に値を保存していくって事ですよね?
それも試したんですが、よくわからないエラーが発生して動作が止まってしまいました
0449デフォルトの名無しさん
垢版 |
2018/01/10(水) 16:16:37.99
それか、Invokeでアクセスする



// コントロールが破棄されてないかチェック
if (trackbar.IsDisposed)
return;


var value = 0;

// Invokeが必要かチェック
if(trackbar.InvokeRequired) {
Invoke((MethodInvoker)(() => {
value = trackbar.Value;
}));
} else {
value = trackbar.Value;
}
0450デフォルトの名無しさん
垢版 |
2018/01/10(水) 16:19:33.71
>>448
じゃあ、値変更イベントハンドラ内でトラックバーの値をフィールドに設定するところと、バックグラウンドワーカーでそのフィールドから値を読み出すところを、lock{...}で囲む
0451デフォルトの名無しさん (ブーイモ MM7f-jqvb)
垢版 |
2018/01/10(水) 16:24:33.20ID:yZjeHBZDM
その処理は別スレッドでないと出来ないのか?
という身もフタもない突っ込み
0453デフォルトの名無しさん (ガックシ 067f-Sycn)
垢版 |
2018/01/10(水) 16:33:27.10ID:+iIpBJgq6
>>450
ちょっと用事ができたので今は試せませんが、両方試してみます

>>451
割と重い処理なので、同じスレッドのトラックバーのイベントハンドラで処理を行うと、トラックバーの動きがかくついてしまったので、分離したいんです
0455デフォルトの名無しさん (ガックシ 067f-Sycn)
垢版 |
2018/01/10(水) 17:01:05.31ID:+iIpBJgq6
>>454
課題でバックグラウンドワーカー指定されてたので、
それ初めて聞いたんですが、同じような事が出来るんですか?
0457デフォルトの名無しさん (ガックシ 067f-Sycn)
垢版 |
2018/01/10(水) 17:17:37.84ID:+iIpBJgq6
>>456
それってバックグランドワーカーを開始する時に値を渡す事ですか?
WhileとReportProgressで画像表示していて、バックグランドワーカーは止まらないので開始時の値を引き渡すのだけでは、トラックバーの値変更に対応できなさそうですが、できるんですか?
的外れな事言ってたらすみません。
まだ学び始めたばかりでわからない事だらけなので

ちなみに画像生成に使うトラックバーは7本あります
0459デフォルトの名無しさん (ワッチョイ 0f9a-+W2v)
垢版 |
2018/01/10(水) 17:42:20.90ID:8CBJwk4h0
>>448
処理イベントを多重呼び出ししていない?
busyのときは呼ばないように
>>446
>whileとReportProgressでtrackbarの変更に合わせて
ReportProgressでは元のスレッドのコントロールにアクセスできるからこの意味がいまいちわからないが
とりあえず
・BackgroundWorker_DoWorkに渡す
https://dobon.net/vb/dotnet/programing/displayprogress.html#backgroundworker
呼び出す側
int value=trackbar.Value;
BackgroundWorker1.RunWorkerAsync(value);
Do_Work側
int value=(int)e.Argument;
>>453
>割と重い処理なので、同じスレッドのトラックバーのイベントハンドラで処理を行うと、トラックバーの動きがかくついて
かくつかない程度に仮処理用の縮小画像を作る
>>457
>トラックバーの値変更に対応できなさそうですが
リアルタイムに反映は理屈から言うと無理
処理量が少なければそう見えるようにも作れるから画像が大きければトラックバー動作中は縮小画像で
0460デフォルトの名無しさん (アウアウエー Sa3f-iSeT)
垢版 |
2018/01/10(水) 17:43:56.21ID:ZlAR0fHNa
>>455
>>446と同一人物?

仕様の詳細が分からんので断定はできないけど、
断片的な情報から判断すると

(1) 無限ループでTrackbar.Valueをポーリングして

(2) 変化を検出したら画像生成を開始

(3) 完了したらBackgroundWorkder.ReportProgressを呼んで
UIスレッドで画像を表示

こういうこと?
もしこうなら、スレッドで無限ループ回すって発想がたぶん間違ってる。

諸事情でBackgroundWorkderを使う必要があるにしても
Trackbar.ValueCangedイベントでBackgroundWorker.RunWorkerAsyncを
呼んで都度画像生成処理を開始するようにした方がいいんじゃないの?

それならTrackbar.ValueはRunWorkerAsyncの引数で渡せる
0462デフォルトの名無しさん (アウアウエー Sa3f-iSeT)
垢版 |
2018/01/10(水) 17:54:40.44ID:ZlAR0fHNa
ただこの場合でも、ValueCangedはたぶんユーザーがつまみを動かかしている間は
逐次的にイベントが発生しちゃうと思うから、BackgroundWorker.RunWorkerAsyncを
コールするのは、例えばValueCangedが発生しなくなってから1秒後、みたいな工夫がたぶん必要になるのかな

知らんけど
0463デフォルトの名無しさん
垢版 |
2018/01/10(水) 18:00:54.81
>>459
起動時にRunTaskWorkerを呼び出す。

doWorkでは無限ループでトラックバーの値の変更を監視

こういうことだと思う。
知らんけど。
0464デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/11(木) 01:51:14.39ID:fK8uCW920
public void testA()
{
bool error=false;

error=true;
if (error == true) { return; }

textBox1.Text = "ok";
}

error=true;
if (error == true) { return; } をまとめてメソッドtestBにするにはどうすればいいでしょうか
testAの中でtestBを実行し、testBでエラーが出たらtestAもそこで処理を中止して
textBox1.Text = "ok";を実行しない
というプログラムを作りたいのですが
0465デフォルトの名無しさん
垢版 |
2018/01/11(木) 02:26:04.02
これじゃダメ?
―――――――――
...
var error = testB();
if(error) return;
...
―――――――――
public bool testB(){
var error=false;
error=true;
if(error) return true;
retrun false;
}
―――――――――
0466デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/11(木) 02:53:49.75ID:fK8uCW920
>>465
やはりtestBメソッドの後で判定するしかないですよね。
ありがとうございます。
0470デフォルトの名無しさん
垢版 |
2018/01/11(木) 09:58:05.61
あと、多分FullRowSelectプロパティをオンにしないと行をクリックしたときに一列分しか色が付かない
0472デフォルトの名無しさん (ワッチョイ 4a0f-nl4B)
垢版 |
2018/01/11(木) 18:47:50.43ID:9ePH9NvT0
>>469,>>470
ありがとうございます
1つのコントロールで実現できるのですね
作るときにFullRowSelectも意識してみます
0473デフォルトの名無しさん (ワッチョイ 9ee7-p0TQ)
垢版 |
2018/01/12(金) 02:16:04.35ID:gpUPMxg50
今ってC#なら何でもできる時代か?webページもゲームもWindowsアプリもandroidも
0477デフォルトの名無しさん (ブーイモ MMc9-XZ0y)
垢版 |
2018/01/12(金) 09:23:53.14ID:4yLgM4ukM
アプリ開発言語としてはWebのフロントエンドを除けばほぼ何でもできるので
目下最も万能な言語であることには違いないが、道具を前提にして物事を考える癖がつくと頭悪くなるから一つに拘るのはお勧めしないな
0481デフォルトの名無しさん (ブーイモ MM0a-EosG)
垢版 |
2018/01/12(金) 09:54:47.82ID:1+438Ej9M
>>477
WebのフロントエンドはhtmlとJavaScriptという道具を前提とするしか無いが。
0482デフォルトの名無しさん (ブーイモ MM0a-EosG)
垢版 |
2018/01/12(金) 09:58:40.77ID:1+438Ej9M
>>480
騙されたと言うかJavaScriptの進化が速くてJavaアプレットもオワコン
0484デフォルトの名無しさん (スッップ Sd0a-6CSh)
垢版 |
2018/01/12(金) 12:34:17.17ID:OH7R1+qFd
でぇじょうぶだ。wasmがくる。
0487デフォルトの名無しさん (ワッチョイ 9ee7-p0TQ)
垢版 |
2018/01/12(金) 14:42:53.15ID:VxcDYdZu0
職につくために限定的な開発だけじゃあ厳しいなってC#なら何でも作れるようにならないとなって思って
0490デフォルトの名無しさん (ササクッテロラ Spbd-euJe)
垢版 |
2018/01/12(金) 16:00:59.66ID:C/maxB41p
スタブってのがほんとに分からん…
どんな知識が必要でどんな風に使うのかイメージ出来ん
DAO?とかの概念が自分になくてSQLを扱う部分とロジックがごっちゃになってるとそもそもスタブでなんとかしようってレベルですらないのかな
なにか猿でも分かるような記事とかないですか…
0491デフォルトの名無しさん (ブーイモ MM81-EosG)
垢版 |
2018/01/12(金) 16:11:30.81ID:mLvyYLexM
>>490
スタブってテスト用のダミーの事?
0492デフォルトの名無しさん (アウアウウー Sa21-53ns)
垢版 |
2018/01/12(金) 18:24:00.26ID:C2fpfp9ga
>>490
スタブはテストのためのダミーだよ

完成まで一時的にいれておいてビルド通したり
テストで実際の環境に影響をおよぼさないために使う

テストしない
完成まで途中で実行しない
ならいらない
0498デフォルトの名無しさん (ワッチョイ 4aa2-UJUP)
垢版 |
2018/01/13(土) 01:59:49.10ID:zim/eiwV0
sqlserverからレコード取得する処理で、dataReaderを別関数に渡して、
そっちでdataReader.Iten("hogehoge")するのってありですか?

一部のカラム名だけが異なる類似レコードの取得処理をまとめたいなあと
0503デフォルトの名無しさん (ワッチョイ 66e8-QpsD)
垢版 |
2018/01/13(土) 15:48:07.46ID:J9QLRP4o0
ItemItemって考えてるとあいてむってなんだっけ?ってなるよね
0508デフォルトの名無しさん (ワッチョイ 969c-zueB)
垢版 |
2018/01/13(土) 18:22:41.37ID:2EuaVelH0
一時期ORMが流行ったがメモリ食いすぎと重すぎて今じゃBI以外で使う機会がない
軽量wrapperを挟んでクエリ直書きの負担を軽減するというのが最近のスタイル
有名なのはDapper、Massive、PetaPocoとか
0511デフォルトの名無しさん (ワッチョイ 5e20-y5e1)
垢版 |
2018/01/14(日) 11:58:36.30ID:6wMaD5Pe0
質問させてください
まず、やりたいことは以下です
@c#からネイティブライブラリの関数を呼び出す
A引数としてマネージ側で実装した関数を渡し、ライブラリ側でその関数を呼び返す

Aでマネージ関数と一緒にマネージドオブジェクトを渡したいのですが、そのオブジェクトをGC対象から除外する方法が分かりません
GCHandle.Alloc では blittable なオブジェクトでないとダメだと怒られます
List<int> とかを渡したいのですが…… どうしたらいいでしょうか?
0512デフォルトの名無しさん (ワッチョイ 3d23-XZ0y)
垢版 |
2018/01/14(日) 12:44:23.20ID:DNkTPWoH0
>>511
普通にデリゲートをマーシャリングして渡す
呼び出す先が同期的な関数ならGCは考慮不要
非同期的にコールバックしてくるならデリゲートをフィールドに入れておいてGCを防ぐ
デリゲートのマーシャリングは非常に優秀で、メソッド内から外のローカル変数を参照してたりインスタンスフィールドを参照してたりしても問題ない
だからList<int>とかをわざわざ渡す必要はない
0513512 (ワッチョイ 3d23-XZ0y)
垢版 |
2018/01/14(日) 12:45:29.88ID:DNkTPWoH0
補足
メソッドから参照されてるオブジェクトはデリゲートが生きてる限りはGCされないので、
GC対策としてはデリゲートだけフィールドで保持しとけば十分
0514511 (ワッチョイ 5e20-y5e1)
垢版 |
2018/01/14(日) 13:56:18.92ID:6wMaD5Pe0
>>512
ありがとうございます!
解決しました。変数をキャプチャしてるラムダ式でもOKなんですね
これって実行時にコードを生成してるんでしょうか?
0515デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/15(月) 08:04:36.45ID:wzT+kwGj0
visualstudio2015でifの条件式の部分が
if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
b>1&&
c>1&&
d>1)
ときれいに揃える方法はないでしょうか?
ctrl+k,ctrl+dではこの部分だけきれいにならず困っています
0516デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/15(月) 08:05:35.73ID:wzT+kwGj0
if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)

_はスペースです
0518デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/15(月) 08:34:59.05ID:wzT+kwGj0
条件式がたくさんある場合はどうすれば見やすく書けるのでしょう…
横に伸びると見にくくて
0519デフォルトの名無しさん (ワッチョイ 6681-/vYA)
垢版 |
2018/01/15(月) 08:44:15.19ID:6fJ2ahWY0
自分にあったフォーマッタを
自分で開発すればいいんじゃないの?
出来合いで我慢できないならそれしかないでしょ
幸いにもあなたはプログラマーだ
頑張れ
0520デフォルトの名無しさん (ワッチョイ aad4-1Ifv)
垢版 |
2018/01/15(月) 09:00:59.11ID:vPE1QZCU0
if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)

_はスペースです
0521デフォルトの名無しさん (ワッチョイ aad4-1Ifv)
垢版 |
2018/01/15(月) 09:02:06.54ID:vPE1QZCU0
if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)

_はスペースです
0523デフォルトの名無しさん (ワッチョイ 39f7-RcqZ)
垢版 |
2018/01/15(月) 09:34:40.52ID:wzT+kwGj0
522

それでもいいんですが
____if(a>1
&&b>1
&&c>1
____&&d>1)
貼り付け繰り返してるうちにこうなっちゃったりしてるんですよね
■ このスレッドは過去ログ倉庫に格納されています