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
009895 (ワッチョイ cf80-fDvV)
垢版 |
2017/12/23(土) 08:24:22.31ID:FPRjmoIB0
つまり、1〜3 は、OS が行っている事だから、何もできる事が無い。
OS レスのマイコンとかなら、自分でプログラミングするけど

何かをしようとしても、OS がCPU のタイムスライス、
プロセスの優先度・実行順番を決めているから、何もできない

それがOS。
OSレスなら、それらを自分でプログラミングしないといけないから、無理
0099デフォルトの名無しさん (ワッチョイ 2323-bebx)
垢版 |
2017/12/23(土) 08:45:11.75ID:ti8BrBts0
このアスペは>>97も理解してないんだと思うけど、初心者スレだから改めて否定しておく
スレッドが違うだけなら、>>95の123は正しくはこう
1. スレッドAがジョブの情報Jをメモリ上のキューQに登録する
2. スレッドBはQからJを取り出し、Jの内容に従って処理を実行する
3. Bは処理結果RをキューQ'に登録する
4. AはQ'からRを取り出し、後続処理を実行する
AとBの間で普通にQやQ'を直接共有してるだけで、OSなんか全く関係ない
そもそもマルチスレッドに限った話でもなく、例えば、ゲーム内で2つのキャラクターの間でやり取りしたい、
でも直接メソッドを呼ぶと長くなるとか、間にウェイトを入れたいとかで一旦処理をゲームループに戻したい、なんて時にも使える
0100デフォルトの名無しさん (ワッチョイ 6f9f-M1U4)
垢版 |
2017/12/23(土) 10:27:32.58ID:AW7swrGi0
オレオレキューなんぞつかわずにTaskを使え
バックグラウンドといえどインプロセスで長大な処理を発生させるな
そういうのはジョブ管理サービスを使えHangfireとかな
0106デフォルトの名無しさん (ワッチョイ 8f33-9Igo)
垢版 |
2017/12/23(土) 13:21:31.65ID:kNBZIa630
自分のBackgroundWorker使ってるソース見てみると、
処理単位でループして1処理終った後と、長い処理の途中でwk.CancellationPending == trueで抜けるか判定してる
イベント待ちはタイムアウト設定して一旦抜ける
という感じだった
Task使っても同じだろう
0107デフォルトの名無しさん (ワンミングク MM9f-Px6h)
垢版 |
2017/12/23(土) 13:24:28.81ID:eJOJ1LQ5M
@Abortはしたくない
Aメインループのフラグチェックでは頻度が足りない
Bでもフラグチェック処理を書き足すのは嫌だ

要件はこれでいいか?
真面目に考えるとメタプログラミングの領域だな
チェック頻度とパフォーマンスのトレードオフも考えなきゃならん
初心者スレ民の実力では難しいんじゃないか?
0110デフォルトの名無しさん (ワッチョイ f3f7-fDUi)
垢版 |
2017/12/23(土) 13:46:44.49ID:suzKftpB0
たくさんレスありがとうございます。
わからない言葉がたくさんあるので調べてまた来ます。
0111デフォルトの名無しさん (ワッチョイ f3f7-fDUi)
垢版 |
2017/12/23(土) 14:02:46.78ID:suzKftpB0
キーボードをa,b,c,dと順番に5秒置きに押していくメソッドをBackgroundWorker内で無限ループさせていて
キャンセルボタンを押したときすぐに止まって欲しいのですが必ずdまで押されてから止まるので困っているという感じです

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
play_abcd();

if (backgroundWorker1.CancellationPending)
{
// イベントをキャンセルする
e.Cancel = true;
return;
}
}
}
0113デフォルトの名無しさん (ワッチョイ f3f7-fDUi)
垢版 |
2017/12/23(土) 14:19:46.07ID:suzKftpB0
キーボードをa,b,c,dと順番に5秒置きに押していってすぐ途中で止められるプログラムを作るには
どういう方法があるんでしょうか?BackgroundWorkerにはこだわりません。
play_abcd()メソッドには押したボタンをtextBoxに表示する機能もあってBackgroundWorkerを使うと
プログラム実行中でもきちんと表示されるのでBackgroundWorkerを使っています
0114デフォルトの名無しさん (ワッチョイ 6f9f-M1U4)
垢版 |
2017/12/23(土) 14:42:50.03ID:AW7swrGi0
private IEnumerable<Action> GetJobs(int sleepMilliseconds) {
/**/var buttons = new [] { btnA, btnB, btnC, btnD };
/**/while (true) {
/**//**/foreach (var button in buttons) {
/**//**//**/yield return () => button.Click();
/**//**//**/yield return () => Thread.Sleep(sleepMilliseconds);
/**//**/}
/**/}
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
/**/while (true) {
/**//**/foreach (var job in GetJobs()) {
/**//**//**/job();
/**//**//**/if (backgroundWorker1.CancellationPending) {
/**//**//**//**/e.Cancel = true;
/**//**//**//**/return;
/**//**//**/}
/**//**/}
/**/}
}
0119デフォルトの名無しさん (アウアウエー Sadf-HQem)
垢版 |
2017/12/23(土) 16:17:28.04ID:Nxx0V5wTa
>>111
>>113
>play_abcd()メソッドには押したボタンをtextBoxに表示する機能もあって
ってことはたぶんplay_abcdの中でbackgroundWorker1.ReportProgressを呼んでいる、
つまりbackgroundWorker1を参照できる場所にplay_abcdはあるんだから、
素直にCancellationPendingをポーリングするだけじゃないの?
本当はよくないと思うけどねこういうの

本当は前も書いたみたいにplay_abcdのシグネチャを
void play_abcd(Func<bool> canceled){...}

とかにして、呼び出すときに、
play_abcd(() => backgroundWorker1.CancellationPending);

がいいと思う

っていうか、そもそも
>キーボードをa,b,c,dと順番に5秒置きに押していくメソッド
をビジーループで実弁する必要本当にある?w

それ、タイマーで十分実現できると思うんだけど...
0127デフォルトの名無しさん (ワッチョイ 8f9f-9TLc)
垢版 |
2017/12/23(土) 19:47:21.47ID:PvZdk9430
>>113
そもそも、なんで提示したコードがdまで実行しないとキャンセルされないか理解できてる?
理解出来てればBackgroundWorkerを別の手法に変えても意味がないことは分かると思うんだけど
0133デフォルトの名無しさん (ワンミングク MM9f-Px6h)
垢版 |
2017/12/23(土) 21:29:55.10ID:eJOJ1LQ5M
>>131
推測でしかないが質問者のやりたい事ってAPIが提供されてないアプリのGUIオートメーションだと思うんだ
やってみるとわかるけど、等間隔キー入力の繰り返し、のような単調な操作のほうがむしろレアケースだよ
0138デフォルトの名無しさん (ワンミングク MM9f-Px6h)
垢版 |
2017/12/23(土) 21:42:59.27ID:eJOJ1LQ5M
ちなみに>>114の実装ならマクロが多少複雑化しても可読性がそこそこ良いのでオススメ

IEnumerable<Action> GetJobs() {
while (true) {
yield return () => SendKeys("A");
yield return () => Sleep(5000);
yield return () => SendKeys("B");
yield return () => Sleep(2000);
yield return () => SendKeys("ハゲ");
yield return () => Sleep(3000);
yield return () => SendKeys("C");
yield return () => Sleep(5000);
yield return () => SendKeys("D");
yield return () => Sleep(5000);
}

この考え方を進化させてJobsをActionの列挙ではなく式木にしたら記述が楽そうだな、とかインタープリターパターンで実装したらユーザー目線で便利そうだな、とか発展していく
0141デフォルトの名無しさん (ワッチョイ cf80-fDvV)
垢版 |
2017/12/23(土) 22:36:15.16ID:FPRjmoIB0
非同期処理は、コンテキストが異なるから、処理の実行順番は確定しない

ビジーループするのは、もってのほか。
ビジーループは同期処理

非同期処理は、コールバック関数を使う。
相手の処理が終わったら、コールバック関数を呼んでもらう

コンテキストが異なるものは、マルチスレッド・マルチプロセスでも、
OS がCPU のタイムスライス、スレッド・プロセスの優先度・実行順番を決めているから、
プログラマーができる事は無い

複数のスレッド・プロセスは、無関係に同時に、異なるCPU で動く(並行処理)から、
処理時間が短くなるが、処理の実行順番は、OS が決めるから確定しない

同期処理とは異なる
0144デフォルトの名無しさん (ワッチョイ cf80-fDvV)
垢版 |
2017/12/23(土) 23:31:47.43ID:FPRjmoIB0
そもそも、ビジーループ(ポーリング)しても意味がない

例えば、スレッドA から、10ms 毎にポーリングしても、
スレッドB の処理が10秒掛かれば、千回のポーリングは無意味

ポーリングしても、異なるスレッドの処理を速めることはできない。
OS がCPU のタイムスライス、スレッド・プロセスの優先度・実行順番を決めているから

プログラマーにできることは、コールバック関数を登録することだけ。
スレッドBの処理が終われば、それを呼んでもらうだけ
0147デフォルトの名無しさん (ワッチョイ 8f9f-mmj6)
垢版 |
2017/12/24(日) 07:08:55.16ID:kiz3NtEj0
play_abcdって雑な作りから察すると5秒おきってのはaの動作が終わってから5秒なんじゃね?
本当に5秒感覚でキーを押したいならタイマーがいいけど、各動作を5秒感覚で実行したいならタイマーは使わない方がいいかな
0150デフォルトの名無しさん (アウーイモ MM67-1kTE)
垢版 |
2017/12/24(日) 14:33:03.85ID:WF18n6kNM
2〜3台のPCだけで使う小規模なアプリケーションで、不変で追加もしない500×3列程度のデータを扱いたいです。EXCELでいうvlookup関数みたいな参照を行いたいのですが、EntityFrameworkだとSQLserverのインストールが必要?なため別の方法を模索中です。
csvやtxtファイルを実行ファイルと同じフォルダにいれて参照するのがいいか、もしくは別の方法があればご教示いただきたいです
0172デフォルトの名無しさん (ワッチョイ 2323-bebx)
垢版 |
2017/12/25(月) 08:12:45.88ID:W15ZQhn00
>>169
XML比なら、
人間にとって扱いやすい
サイズが小さい
読み書きが速い
属性と要素の使い分けをしなくていい
JSON SchemaはXML Schemaより圧倒的に分かりやすく書きやすい
配列、マップ、数値、論理値、文字列という最低限の型付けがあるので、
プログラミング言語のデータ構造とのマッピングがしやすい(XMLは属性やXML Schemaで明示的にマッピングしてやらないと使い物にならない)
0178デフォルトの名無しさん (ブーイモ MM27-vkjg)
垢版 |
2017/12/25(月) 12:20:28.09ID:sz9H2GSPM
美容番長だっけ?
0183デフォルトの名無しさん (ワッチョイ b303-G8t+)
垢版 |
2017/12/25(月) 18:59:27.21ID:8wInAEQh0
だから上手なDBとか使えばcsvの方より良いんだろ
0185デフォルトの名無しさん (ワッチョイ b303-G8t+)
垢版 |
2017/12/25(月) 19:15:27.15ID:8wInAEQh0
設定ファイル的な話だとしたらjsonって微妙だけどxmlはクソ
xmlはどんな用途向けにもクソ
0188デフォルトの名無しさん (アウアウカー Sac7-Vzer)
垢版 |
2017/12/25(月) 20:07:35.17ID:y0MybC9Za
>>179
ぶっちゃけこれだろ
0189デフォルトの名無しさん (ワッチョイ b303-G8t+)
垢版 |
2017/12/25(月) 20:13:26.84ID:8wInAEQh0
>>186
嫌なのではなくクソだと言っとるのだが?
0192デフォルトの名無しさん (ワッチョイ b303-G8t+)
垢版 |
2017/12/25(月) 20:24:10.15ID:8wInAEQh0
>>190
何が気にいらんのか知らんけど変な絡み方するのやめてもらえんかな?
0196デフォルトの名無しさん (ワッチョイ b303-G8t+)
垢版 |
2017/12/25(月) 20:35:26.95ID:8wInAEQh0
>>194
同じって事はないよ
どの形式でも必要十分な機械可読性を得られるなら
選択の決め手になるのは速度などではなく人間可読性
ヒューマンリーダビリティ
xmlはこれが壊滅的にクソ
■ このスレッドは過去ログ倉庫に格納されています

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