ふらっと C#,C♯,C#(初心者用) Part134
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらない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 ありがとうございます
図はよくわからなかった点も多いので、ゆっくり記事を読んできます よくみたら間違った図ではないが
使う上でなんの説明にもなってない図に訂正
この図だけをみると初心者がハマる ↑の人はたぶんコードと図で1セットになってることに気付かずに
図だけ見てそう言ってるか、あるいはなんか思いっきり勘違いしてるだけだと思うから
安心して参考にしていいと思うw 説明するのが非常に難しいんだけど
async/awaitの挙動をまともに書いてる記事が少ない
有名人でも間違った解説をしてる >「メソッドを一時中断し、awaitされた処理の完了を待って残りの処理を再開する」
非常にグレーな表現
>@に続けてAの処理が別スレッド上で開始される
非常にグレーな表現
HevyWork()の中身が必ずすべて別スレッド上で行われてるわけではない 出来たら苦労しない
場合訳が複雑なので
非常にめんどくさい 言っちゃ悪いけど、これも立派な2ch脳だね
羊たちの沈黙にあった台詞だけど、その批判的精神を自分自身に向けるだけの理性はないのかw >>434
いや、>>428の記事は十分わかりやすいし間違ってもいないから安心していいよw それぞれがそれぞれの心の中でお前が言うなと思う
上にあった図を参考にしてるといつか全然思った通りに動かなくなり?マークになる 初めてのJavaScript 第3版、オライリー、2017
JS には、async/await が無いから、
この本では、generator runner の仕組みを説明している。
co, Koa というライブラリを使う
非同期処理は異なるコンテキストで、
別のスレッド・プロセスだから、どこを実行しているのか分からない。
実行順番も制御できないし、例外処理も使えない
generator runner は非同期処理を、yield で待つように作る。
これにより、非同期処理を同期処理のコンテキストに当てはめるから、
実行順番を制御できるし、例外処理も使える
try{
yield promise 非同期処理
} catch {
} 異なるコンテキストとは、同じソースコードに書いていても、
OS から見ると、別のプロセス・スレッド・実行単位になる
OS は、1秒間に数万回も、実行単位を切り替える(コンテキストスイッチ)から、
今、別の実行単位の、どのコードが実行されているかは、全く分からないし、制御もできない
別の実行単位に対してできることは、
タスクの終了を待つか、タイムアウトするか、タスクを止めてもらうかだけ >>440
>JSには、async/awaitが無い
何言ってんの? 句読点君のレスを判定するアルゴリズムを作ろう
機械学習の勉強によさそう >co, Koa というライブラリを使う
あぁ、このアホか。C#スレまで出張ってきてうざいな。 C#始めて1カ月程度の初心者です
trackbarの値をBackgroundWorkerに渡して、その値を使って別スレッドで画像を生成して、whileとReportProgressでtrackbarの変更に合わせて画像を表示していくプログラムを作っているんですが、
trackbarの値をBackgroundWorker_DoWorkに渡すのってどうやるんですか?
別スレッドなので、trackbar.Valueでそのまま使う事ができなくて…
デバッグ無しの実行ならよく分からないですが、そのまま使っても実行できて上手く画像表示されている事が確認できたので、
スレッド間でtrackbarの値を渡すのだけが上手くいかなくて悩んでます トラックバーの値変更イベントのイベントハンドラでフォームのフィールドにトラックバーの値を保持しておく
それをバックグラウンドワーカーで読み取る >>447
それって両スレッド共通の変数を作っておいてトラックバーが動いた時のイベントハンドラでその変数に値を保存していくって事ですよね?
それも試したんですが、よくわからないエラーが発生して動作が止まってしまいました それか、Invokeでアクセスする
// コントロールが破棄されてないかチェック
if (trackbar.IsDisposed)
return;
var value = 0;
// Invokeが必要かチェック
if(trackbar.InvokeRequired) {
Invoke((MethodInvoker)(() => {
value = trackbar.Value;
}));
} else {
value = trackbar.Value;
} >>448
じゃあ、値変更イベントハンドラ内でトラックバーの値をフィールドに設定するところと、バックグラウンドワーカーでそのフィールドから値を読み出すところを、lock{...}で囲む その処理は別スレッドでないと出来ないのか?
という身もフタもない突っ込み lock (トラックバーの値を保持してる変数) { ... } のミスでした >>450
ちょっと用事ができたので今は試せませんが、両方試してみます
>>451
割と重い処理なので、同じスレッドのトラックバーのイベントハンドラで処理を行うと、トラックバーの動きがかくついてしまったので、分離したいんです >>454
課題でバックグラウンドワーカー指定されてたので、
それ初めて聞いたんですが、同じような事が出来るんですか? >>455
BackgroundWorkerは、標準機能で専用のeventargを使ってオブジェクトを一つ引き渡せたはずだが
マニュアルしっかり見たほうが良いよ >>456
それってバックグランドワーカーを開始する時に値を渡す事ですか?
WhileとReportProgressで画像表示していて、バックグランドワーカーは止まらないので開始時の値を引き渡すのだけでは、トラックバーの値変更に対応できなさそうですが、できるんですか?
的外れな事言ってたらすみません。
まだ学び始めたばかりでわからない事だらけなので
ちなみに画像生成に使うトラックバーは7本あります >>455
async/awaitならイベントハンドラの中に1行で非同期処理書ける
課題なら仕方ない >>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
>トラックバーの値変更に対応できなさそうですが
リアルタイムに反映は理屈から言うと無理
処理量が少なければそう見えるようにも作れるから画像が大きければトラックバー動作中は縮小画像で >>455
>>446と同一人物?
仕様の詳細が分からんので断定はできないけど、
断片的な情報から判断すると
(1) 無限ループでTrackbar.Valueをポーリングして
(2) 変化を検出したら画像生成を開始
(3) 完了したらBackgroundWorkder.ReportProgressを呼んで
UIスレッドで画像を表示
こういうこと?
もしこうなら、スレッドで無限ループ回すって発想がたぶん間違ってる。
諸事情でBackgroundWorkderを使う必要があるにしても
Trackbar.ValueCangedイベントでBackgroundWorker.RunWorkerAsyncを
呼んで都度画像生成処理を開始するようにした方がいいんじゃないの?
それならTrackbar.ValueはRunWorkerAsyncの引数で渡せる >>460
ブラウザ部分同じだから同一人物で間違いない
>>457
次からレス番でコテハン付けて
一応捕捉でRunWorkerAsyncの引数はobjectなので
https://msdn.microsoft.com/ja-jp/library/f00zz5b2(v=vs.110).aspx
受ける側でキャストしたらListでも配列でも使える ただこの場合でも、ValueCangedはたぶんユーザーがつまみを動かかしている間は
逐次的にイベントが発生しちゃうと思うから、BackgroundWorker.RunWorkerAsyncを
コールするのは、例えばValueCangedが発生しなくなってから1秒後、みたいな工夫がたぶん必要になるのかな
知らんけど >>459
起動時にRunTaskWorkerを呼び出す。
↓
doWorkでは無限ループでトラックバーの値の変更を監視
こういうことだと思う。
知らんけど。 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";を実行しない
というプログラムを作りたいのですが これじゃダメ?
―――――――――
...
var error = testB();
if(error) return;
...
―――――――――
public bool testB(){
var error=false;
error=true;
if(error) return true;
retrun false;
}
――――――――― >>465
やはりtestBメソッドの後で判定するしかないですよね。
ありがとうございます。 Janeでいう画像のようなフォームを作りたいのですが、
フォームにはどのようなコントロールを配置しているのでしょうか?
列名にはButton、一覧はListBoxのように見えます。
https://imgur.com/a/mOqw6 >>464
> testAの中でtestBを実行し、testBでエラーが出たらtestAもそこで処理を中止して
> textBox1.Text = "ok";を実行しない
例外で一気に抜ければいいだろ >>467
ListBoxのViewプロパティをDetailsにしたやつと同じ
上のボタンはColumnsプロパティで編集できる あと、多分FullRowSelectプロパティをオンにしないと行をクリックしたときに一列分しか色が付かない >>469,>>470
ありがとうございます
1つのコントロールで実現できるのですね
作るときにFullRowSelectも意識してみます 今ってC#なら何でもできる時代か?webページもゲームもWindowsアプリもandroidも 初めて目にしたものに万能感を感じてるだけ、刷り込みという でもここまで全部作れる時代ってないんじゃん?
全部c言語の時代以来だな アプリ開発言語としてはWebのフロントエンドを除けばほぼ何でもできるので
目下最も万能な言語であることには違いないが、道具を前提にして物事を考える癖がつくと頭悪くなるから一つに拘るのはお勧めしないな まあ、なんでもいいしね
msにはsilverlightに騙されたのでこの辺の信用は薄い >>477
WebのフロントエンドはhtmlとJavaScriptという道具を前提とするしか無いが。 >>480
騙されたと言うかJavaScriptの進化が速くてJavaアプレットもオワコン なんかWeb系の人多いね
Webとは一切関わらずに来たから
色々と世界の違いを感じるわ 直接の原因はセキュリティ対策を名目にしたプラグイン排除の動きでしょ >>483
そっちはついで
サーバー側がメインに決まってんじゃん
片手間で意外と時間がかかるのがムカつく
画面なんかデザインと相談しろよ 職につくために限定的な開発だけじゃあ厳しいなってC#なら何でも作れるようにならないとなって思って >>487
逆引き辞典でも買っとけ
〜できる?って聞かれたときいいぞ スタブってのがほんとに分からん…
どんな知識が必要でどんな風に使うのかイメージ出来ん
DAO?とかの概念が自分になくてSQLを扱う部分とロジックがごっちゃになってるとそもそもスタブでなんとかしようってレベルですらないのかな
なにか猿でも分かるような記事とかないですか… >>490
スタブはテストのためのダミーだよ
完成まで一時的にいれておいてビルド通したり
テストで実際の環境に影響をおよぼさないために使う
テストしない
完成まで途中で実行しない
ならいらない ここ雑談所とかロビーじゃないんで
リンクテンプレにあるんだからワッチョイの無い相談室でやればいいのに sqlserverからレコード取得する処理で、dataReaderを別関数に渡して、
そっちでdataReader.Iten("hogehoge")するのってありですか?
一部のカラム名だけが異なる類似レコードの取得処理をまとめたいなあと >>498
それ自体は特に問題はないけど、可能ならDapperとか使った方がいい >>498
その手の仕事なら、拡張メソッドで書くとスッキリ書けるよ >>498
Itenがなにかはわからんけど、dataReader を渡すのはありでしょ ItemItemって考えてるとあいてむってなんだっけ?ってなるよね データが大量の場合は予めカラム名から序数取得しておいて、序数指定にするんだっけか
今はDapperばかりだから忘れたわ 一時期ORMが流行ったがメモリ食いすぎと重すぎて今じゃBI以外で使う機会がない
軽量wrapperを挟んでクエリ直書きの負担を軽減するというのが最近のスタイル
有名なのはDapper、Massive、PetaPocoとか >>508
Micro-ORM ですか、Java にはあまりなさそうですね
BI ってなんの略ですか? 498だす
いろいろありがとう
Dapperって知らなかったので調べてみます 質問させてください
まず、やりたいことは以下です
@c#からネイティブライブラリの関数を呼び出す
A引数としてマネージ側で実装した関数を渡し、ライブラリ側でその関数を呼び返す
Aでマネージ関数と一緒にマネージドオブジェクトを渡したいのですが、そのオブジェクトをGC対象から除外する方法が分かりません
GCHandle.Alloc では blittable なオブジェクトでないとダメだと怒られます
List<int> とかを渡したいのですが…… どうしたらいいでしょうか? >>511
普通にデリゲートをマーシャリングして渡す
呼び出す先が同期的な関数ならGCは考慮不要
非同期的にコールバックしてくるならデリゲートをフィールドに入れておいてGCを防ぐ
デリゲートのマーシャリングは非常に優秀で、メソッド内から外のローカル変数を参照してたりインスタンスフィールドを参照してたりしても問題ない
だからList<int>とかをわざわざ渡す必要はない 補足
メソッドから参照されてるオブジェクトはデリゲートが生きてる限りはGCされないので、
GC対策としてはデリゲートだけフィールドで保持しとけば十分 >>512
ありがとうございます!
解決しました。変数をキャプチャしてるラムダ式でもOKなんですね
これって実行時にコードを生成してるんでしょうか? visualstudio2015でifの条件式の部分が
if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
b>1&&
c>1&&
d>1)
ときれいに揃える方法はないでしょうか?
ctrl+k,ctrl+dではこの部分だけきれいにならず困っています if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)
_はスペースです >>514
ない
そんな非生産的なコーディング規約は今すぐ撤廃しなさい 条件式がたくさんある場合はどうすれば見やすく書けるのでしょう…
横に伸びると見にくくて 自分にあったフォーマッタを
自分で開発すればいいんじゃないの?
出来合いで我慢できないならそれしかないでしょ
幸いにもあなたはプログラマーだ
頑張れ if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)
_はスペースです if(a>1&&
b>1&&
c>1&&
d>1)
となっているのを
if(a>1&&
__b>1&&
__c>1&&
__d>1)
_はスペースです >>515
その前に書くなら
if(a>1
&&b>1
&&c>1
&&d>1)
って揃えるべきじゃね?
そういう視点で見るとどうよ? 522
それでもいいんですが
____if(a>1
&&b>1
&&c>1
____&&d>1)
貼り付け繰り返してるうちにこうなっちゃったりしてるんですよね 俺だったらIsXXXみたいなboolを返すメソッドに分けちゃう。 ■ このスレッドは過去ログ倉庫に格納されています