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

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

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
294デフォルトの名無しさん
垢版 |
2020/02/14(金) 12:38:43.18ID:a5iC3cHy
日本語は必須事項ではないので多分大丈夫です
295デフォルトの名無しさん
垢版 |
2020/02/14(金) 12:47:36.23ID:7R4aPKWb
PDF仮想プリンタの存在前提で普通にGDI+で書けば楽だと思うけどな
Win10ならデフォで入ってるんだし
296デフォルトの名無しさん
垢版 |
2020/02/14(金) 13:04:12.74ID:a5iC3cHy
なるほど!
検討してみます。ありがとう!
297デフォルトの名無しさん
垢版 |
2020/02/28(金) 18:11:07.35ID:HAMXUqwp
win32のhage.rcファイルからhage.resを造って-win32res:hage.resでexeにリンクしてるとき

hage.rcの中身が
hogehoge BITMAP "filename.bmp"
のときは
Bitmap a = Bitmap.FromResource(hInst, "hogehoge");
で取得出来るのですが

hage.rcの中身が
456 BITMAP "filename.bmp"
だと
Bitmap b = Bitmap.FromResource(hInst, 456);
Bitmap b = Bitmap.FromResource(hInst, Convert.ToString((IntPtr)456));
Bitmap b = Bitmap.FromResource(hInst, Convert.ToString((IntPtr)((UInt16)456)));
とかで取得出来ないのですが
456を上手くBitmap.FromResource()に渡す方法は無いのでしょうか?
2020/02/28(金) 18:48:54.41ID:snfNueOm
https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Bitmap.cs,8fd8c12a4ea73bbb
パブリックなのはないね
299デフォルトの名無しさん
垢版 |
2020/02/28(金) 19:02:19.22ID:HAMXUqwp
ありがとう
これだと自分でWin32APIのLoadBitmap呼んだ方が速い気がしないでもない
300デフォルトの名無しさん
垢版 |
2020/03/01(日) 05:48:57.42ID:wVHwYgLC
こっちは2018年かよ
雑談するには迷惑かからんでいいけど
301デフォルトの名無しさん
垢版 |
2020/03/01(日) 16:22:20.47ID:KSyofv5N
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern IntPtr LoadBitmap(IntPtr hInst, IntPtr id);
[DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr handle);

IntPtr p = (IntPtr)((UInt16)id);
IntPtr hBitmap = LoadBitmap(hInst, p);
Bitmap b = (Bitmap)Image.FromHbitmap(hBitmap);
DeleteObject(hBitmap);
return b;
でうまくいきました
CharSet=CharSet.Auto を書かなくても動くのですが
書かない場合だと LoadBitmapW ではなく LoadBitmapA の方が使われるようで
id が数値リソースのときは問題出ないのですが string でリソース名を指定するときに
参照されなくなるので書いておく方が良さそうです
IntPtr p = Marshal.StringToHGlobalAuto(rn); // OK
IntPtr p = Marshal.StringToHGlobalUni(rn); // OK
IntPtr p = Marshal.StringToHGlobalAnsi(rn); // CharSet.Auto 書かないときはこっちを書くと動作
302デフォルトの名無しさん
垢版 |
2020/03/02(月) 10:28:32.19ID:NX3+Q9hq
C#というより.NET Framework全般の問題かもしれませんが・・・
ビルドした実行ファイルの拡張子を7zにして開けると
   .rsrc(フォルダ)
   .text
   .reloc
というファイルが出てきます

このうち「.text」をエディタで開けると

「C:\Users\ユーザー名\source\repos\プロジェクト名\obj\Release\実行ファイル名.pdb」

の文字列がそのまま入っておりユーザー名まで見えてしまいます

プロジェクトのプロパティなど見てみましたが該当する文字列は設定されていませんでした

この文字列が入らないようにビルドするにはどうすれば良いでしょうか?
303デフォルトの名無しさん
垢版 |
2020/03/02(月) 10:29:26.56ID:NX3+Q9hq
あ、本スレは別でしたかすみません
2020/03/02(月) 10:31:33.41ID:nPQHiUH/
>>302
C#の問題じゃなくVisual studioとかのビルド側の設定の話だから該当するスレでやれ
305デフォルトの名無しさん
垢版 |
2020/03/02(月) 11:10:23.06ID:glnmwhpK
hoge.Dispose()って必ず呼ぶ必要ありますか?
ネットにあるサンプルでDispose()してるのと放ったらかしなのとあるようですが
放ったらかしでも問題無いとしたらわざわざDispose()呼ぶのはなぜですか?
2020/03/02(月) 11:55:33.00ID:OjHPSko6
>>305
必ず呼ぶ必要はないが呼んだ方が良い

o リソース解放のタイミングやスレッドが制御できないのでそれらに依存する場合不具合の温床になる可能性
o 無駄なオブジェクトの昇格が起きてしまいGCに悪影響が出る可能性

いずれも無視できる場合もあれば致命的になる場合もある
サンプル程度で目くじら立てる必要はまったくないが
本番では呼んだ方が良い
307デフォルトの名無しさん
垢版 |
2020/03/02(月) 12:09:29.55ID:glnmwhpK
なるほどありがとうございます
ちなみに
using(Graphics g = Graphics.FromImage(hoge)){
...
}
みたいなときスコープ抜けるとgのDispose()は呼ばれないですか?
抜ける前に自分でg.Dispose();しておく必要ありますか?
2020/03/02(月) 12:27:47.69ID:MTJ6Jwm2
disposeを自動で呼んでもらうためにusing構文がある
2020/03/02(月) 15:08:50.50ID:rG8m8EdX
>>307
せめてこのあたりは一読してから質問した方がいい
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement
310デフォルトの名無しさん
垢版 |
2020/03/02(月) 15:54:23.45ID:glnmwhpK
解決しました
これでコードが随分スッキリしました
https://clickan.click/idisposable/
311デフォルトの名無しさん
垢版 |
2020/03/02(月) 16:35:38.68ID:glnmwhpK
何か今までGCに任せれば良いやって適当に書いてたんですが
意外とDispose()呼ばないといけない場所多いんですね
312デフォルトの名無しさん
垢版 |
2020/03/02(月) 16:37:42.01ID:glnmwhpK
クラスを書く時デストラクタとDisposeを省略するなっていうのが今回得た教訓かも知れません
2020/03/02(月) 17:18:06.30ID:8o+Bfjp3
ちゃんとした製品にするようなソフトならケアするけど個人やチームで使う程度のちょっとしたツールだったら一切書かないな
314デフォルトの名無しさん
垢版 |
2020/03/02(月) 17:24:53.84ID:qKOTAeuh
グラフィック周りや通信周り、データーベース周りあたりはちゃんと書いといた方がいいんじゃねえか?
315デフォルトの名無しさん
垢版 |
2020/03/02(月) 18:39:31.60ID:eX7+1wsX
稼げるブログの始め方をブロガーが解説!副業や不労所得を作る
https://www.youtube.com/watch?v=CHn6tNCYAZM
第1回 ブログをどうやって始めるのか?初心者の頃に知りたかったことをブロガーがわかりやすく解説【ブログで稼ぐ】
https://www.youtube.com/watch?v=TEMUZvQSM1Q&;t=708s
第2回 ブログで不労所得1億円!?ブログでお金を稼ぐ仕組みを解説〜
イケダハヤトさんはブログで年間1.5億円の収入!【ブログで稼ぐ】
https://www.youtube.com/watch?v=eWw-RfbNP1g
第3回【学生向け】ブログで月1万円を稼いでいる実例をわかりやすく紹介〜
ブログやアフィリエイト入門。【ブログで稼ぐ】
https://www.youtube.com/watch?v=mjHp2Fqj9OE&;t=190s
第5回 月100万円を稼げるようになった体験談!副業でブログを開始し不労所得に!【ブログで稼ぐ】
https://www.youtube.com/watch?v=nwrlcNSdw0U&;t=523s
サラリーマンをやりながらどうやって副業をやっていたのか?スケジュールや作業量などを解説
https://www.youtube.com/watch?v=FGlGur0XC_k
2020/03/02(月) 19:08:02.78ID:rG8m8EdX
>>311
メモリーはGCでいいけど>>314が言うような通信、データベースとかファイルとかリソース掴む奴はDispose呼ばないと他のプロセスが掴めなくなったりするから必要なくなったらDisposeしといた方がいい
2020/03/02(月) 19:16:23.68ID:dv6bLfIQ
そしてHttpClientで大量のTIME_WAITを抱えると
2020/03/02(月) 20:10:59.40ID:UF2yd5CT
デストラクタはへたに実装しないほうが良いかもしれんぞ
2020/03/02(月) 20:13:55.05ID:sj+3ONQ9
また要件の定まらないくだらない議論始めるのか?
2020/03/02(月) 20:18:10.66ID:mQ4CLNjj
>>307
Graphicsの実装次第だよ
usingで後始末がされるためにはされるように処理を作成する必要がある

みんなが作ってて広く普及してるクラスなら多分大丈夫だけど
今回のプロジェクトで作成したばっかのクラスはテストやるまで信用するな
321デフォルトの名無しさん
垢版 |
2020/03/02(月) 20:37:39.86ID:4FWK+c4C
既視感しか感じない質問だからどうせアレだろと思ったら本気の質問だったのかなw
2020/03/02(月) 22:53:10.49ID:ywWMC8is
>>320
> Graphicsの実装次第だよ
はあ?
g.Dispose()を呼ばない実装なんてできるのか?w

> usingで後始末がされるためにはされるように処理を作成する必要がある
それはまた別の話な
323デフォルトの名無しさん
垢版 |
2020/03/02(月) 23:49:32.46ID:4FWK+c4C
まあ可能不可能ならこういうことは可能だろうね
public class Graphics : IDisposable
{
  void IDisposable.Dispose()
  {
  }

  public void Disposable()
  {
    ...
  }
}
2020/03/03(火) 00:51:00.55ID:uFujH6tR
>>323
public class Graphics
{
  void Dispose()
  {
  }
}

( ゚д゚)・・・
2020/03/04(水) 09:15:28.58ID:TuAQ3w56
プログラミングそのものの話ではないんですが、c#で他の機械とソケット通信してデータやり取りしてこちらからの指示やその応答でなんらかの処理を行うプログラムはどう作るのが一般的なのでしょう?

通信を行うプログラムと業務用にオペレータからの操作とその他を担うプログラムにわけて作ろうと思っています。
通信相手はIOTのマイコンのようなもので独自のプロトコルがTCP/IP上で規定されています。

通信プログラムと業務用のアプリのデータのやり取りはファイルとしてデータを保存するのも手ではあるのですが、読み書き遅いので、共有メモリ的な使い方とかメッセージ的な使い方にならないかな、と。
linux上でc言語ばかり使っているので、どうするのが一般的なのかよく分かっておりません。

よろしくお願いします。
326デフォルトの名無しさん
垢版 |
2020/03/04(水) 09:44:00.83ID:hHbt2ovK
他の機械がWindowsならVNCサーバー入れるのが一番楽
2020/03/04(水) 09:51:06.45ID:TuAQ3w56
>>326
ありがとうございます
通信相手はIoTの小さなマイコンでOSはありません
2020/03/04(水) 09:51:13.72ID:VYRn8ATr
質問がごちゃっとしてるけど
要はローカルマシン内でプロセス間通信したいってこと?
今はgRPCが推されてるんじゃね 知らんけど
2020/03/04(水) 10:18:47.95ID:TuAQ3w56
>>328
わかりにくくてすいません
二つあって、ソケット通信するプログラムと業務用のプログラムを分けて作る場合の普通の作り方です

ソケット通信するプログラムは言語に付属してるライブラリをそのまんま使うしかないなと思ってます
プロトコルは規定されてるのでうまく作れないならcで作るしかないかな、と

業務用のアプリとソケット通信するプログラムのIPCはc#でどうやるのがWindowsの流儀なのか、お尋ねしております

ご教示いただいたgRPCは後者についての情報ですね
はじめて聞く技術なのでわかっておりませんが、参考とさせていただきます。少し道具立てが大きそうですね

ありがとうございます
330デフォルトの名無しさん
垢版 |
2020/03/04(水) 10:24:23.69ID:hHbt2ovK
>linux上でc言語ばかり使っているので、どうするのが一般的なのかよく分かっておりません。

「、」の前後で矛盾してるな
2020/03/04(水) 10:27:39.48ID:ITD9wOqz
普通にSocket使うけどな
2020/03/04(水) 10:36:36.26ID:TuAQ3w56
>>330
普段はlinuxでc言語ばかり使っています
Windowsでc#を使うことがなかったので、どういうものが普通とされているのか分かっておらず、戸惑っております
2020/03/04(水) 10:37:16.05ID:TuAQ3w56
>>331
IPC的なものは使わずにソケット通信すると言うことですか。なるほど。
2020/03/04(水) 10:51:26.57ID:VYRn8ATr
TCP/IP通信自体は.NETにもSystem.Net.Sockets.SocketやらSystem.Net.Sockets.TcpClientやら用意されてる
TCP/IP上で独自プロトコルならこの辺使うけどIPCでは普通直接は使わない
2020/03/04(水) 11:10:56.42ID:ITD9wOqz
>>334
いや325に独自プロトコルって書いてあったんでな
2020/03/04(水) 11:18:37.67ID:TuAQ3w56
>>334、335

わかりにくくてすみません
IoTデバイスとの通信はTPCIP上で独自のアプリケーションプロトコルが規定されてて、それに従います

それをやる通信用のプロセスと別建ての業務用のプロセスの間でもデータのやりとりを行う必要があるのですが、IPCはどうやって普通は実現してるのかがC#を使う上でわかっておりません
2020/03/04(水) 11:37:01.00ID:nNNW6i++
プロセス間通信って、共有メモリみたいな奴か?
2020/03/04(水) 11:58:57.18ID:TuAQ3w56
>>337
他にも組み合わせて使うと思いますが、その通りです。
2020/03/04(水) 12:31:07.29ID:TuAQ3w56
ど素人め、定番はこれだって回答がすぐにないのは
ひょっとすると、プロセスごとにわけて機能を作り込むような考え方はWindowsというかC#というかわからないですが、一般的ではないのでしょうか?
2020/03/04(水) 12:55:31.61ID:RbQqNGaU
触っちゃいけない人だったか
2020/03/04(水) 13:05:25.33ID:TuAQ3w56
>>340
私の書いた文はわかりにくいかもしれませんが、そのご指摘はどういう意味なのでしょうか?
342デフォルトの名無しさん
垢版 |
2020/03/04(水) 13:37:21.24ID:SkBOTqi1
>>341
自己紹介だと思っておけばいいよw
あなたは普通に質問してるだけだと思う。問題があるのは彼の方だろう。
2020/03/04(水) 13:43:31.55ID:pkFzTgEj
普通の方法があるんじゃなくて目的に応じて複数の方法があるという当たり前の話なだけなので
普通の普通の連呼されてもこんな方法もあるよって情報が増えるだけやぞ
既にもらった情報で自分の目的に合致するのか一旦実践した方がいいんじゃねえの

なんか最初のレス見る限りメモリマップトファイルとかウィンドウメッセージで事足りる話に見えるが
2020/03/04(水) 13:57:38.59ID:ITD9wOqz
元々のSocketはプロセス間通信用
SockAddr の AF_UNIXがそれ。
Windowsは長い間、AF_UNIXをサポート
していなかったが、去年ぐらいからwin10で使えるようになっている。(デスクトップとWSLの場合)

いつディスコン喰らうか判らない高位ライブラリーを使うか、
自分に技術蓄積がある(?)下位ライブラリーを使うかの判断はケースバイケースでしょぅね

幸運を
2020/03/04(水) 14:38:19.70ID:TuAQ3w56
>>342
なるほど

>>343
おっしゃることはよくわかります
抽象的でフワフワしてる質問であることも承知しております
その上で、デファクトスタンダードというかどこでもこんな方法よく使ってるよというご意見があればと。
手法についてご教示ありがとうございました

>>344
そうですね
一度使い始めると、それなりに長い寿命のソフトになってしまうので、悩ましいところです
簡単に捨てられるような技術だと
AF_UNIXかそれともINETでループバックで使うのもありですが、難しいですね

ありがとうございます
2020/03/04(水) 17:35:15.89ID:/myb4o4P
いろいろとアドバイスしてくれてる人たちに
ど素人め
と罵倒したのはなんだったの?
2020/03/04(水) 18:01:30.38ID:TuAQ3w56
>>346
ははは
そう解釈されましたか

識者「ど素人め、定番はこれだ」
私 なるほどー

という意味で書いたのですが、誤読を誘発してしまいましたね

私が他者へど素人めと言ってるわけではなく、識者ならこんなフワフワした質問は、パッと答えてくれるかなと思って書いたのです
2020/03/04(水) 18:01:58.08ID:VYRn8ATr
346
それは誤読
2020/03/04(水) 18:19:39.77ID:yiNVycVp
>>325
>通信を行うプログラムと業務用にオペレータからの操作とその他を担うプログラムにわけて作ろうと思っています。

プロセスとかプログラムを分けて作りたい理由って何なの?
書いてる内容だけだとライブラリ化すれば十分なように思えるけど
2020/03/04(水) 18:32:10.50ID:TuAQ3w56
>>349
機能が違うのが一番の理由です

設計するにあたって、通信の機能は独自のプロトコルがあるのでそれなりに考慮しなきゃいけないことが多くて、通信に専念させたいのですね

業務用のプロセスは、こちらはこちらでUIがありますので、通信を行う機能とは考察しなきゃいけないところが違います

また、両者の動作タイミングが全く違うこともありますね
351デフォルトの名無しさん
垢版 |
2020/03/04(水) 18:41:49.49ID:SkBOTqi1
機能が違うだけならプロジェクト分けてdll化すればよいだけなので、
普通に考えれば不特定多数(いやらしい言い方だけど)からのアクセスが要件なんでしょうたぶん

知らんけど
2020/03/04(水) 18:49:53.82ID:TuAQ3w56
>>351
動作タイミングが違いますので、dll化では実現できないと考えています。

一つのプロセスで実現するにはマルチスレッド化せざるを得ないと思うのですが、そうすることは暗黙でみな承知している事柄なのでしょうか?

マルチスレッドでもマルチタスクでも似たような考察点はあるのでどちらを採用しても作成する難易度は大差ないのだとは思いますが、知識が余りに不足しており、マルチスレッドスレッド化したプロセスのデバッグは私では困難極まりないとも考えています。
353デフォルトの名無しさん
垢版 |
2020/03/04(水) 18:56:27.09ID:SkBOTqi1
>>352
アクセスさせる相手が常に同じならプロセス間通信なんてまどとっこしいことを
する意味はないような気がする。

マルチスレッドはもちろん落とし穴いっぱいだけど、過度に恐れる必要はないし
そこまで難易度高くないと思う。
354デフォルトの名無しさん
垢版 |
2020/03/04(水) 18:58:21.75ID:SkBOTqi1
少なくとも自分はプログラミング始めて半年でも普通に使ってましたよw
2020/03/04(水) 19:04:15.58ID:GfItxBVT
スレッド間通信だって、プロセス間通信だって同じことじゃん
プロセスを分けたからって通信にだけ専念するなんて造りにはできない

通信タスク⇔アプリタスク

と並列に動く2つのタスクの接点処理を作ってやらないと動かないぞ
2020/03/04(水) 19:08:19.47ID:TuAQ3w56
>>353
ありがとうございます

考え方ですね

勿論、通信と業務双方まとめて考察できてモノシリックな作りに出来たらそれはそれで良いのだと思います。

通信機能は状態遷移に従って色々やらせる事があるので、業務用の機能と合わせて考察するのは、私にはなかなか難しいのです。

ちなみに、可能でしたらご教示頂きたいのですが、マルチスレッドのプログラムのデバッグ手法はどのようなものでしょうか
webや良書など、参考にされたものがありましたら教えていただけませんでしょうか

マルチタスクのプロセス構成で、どうしてもsemaphore的な扱いの部分で考え落ちのバグがあり、状態遷移に基づいて試験してもバグをかなり流出させてしまったことがありまして。
勿論、分岐網羅や境界値分析で一通り全ての試験をこなしてはいたのですが
まして未経験のスレッドだとどうなるやらわからず二の足を踏んでおります。
2020/03/04(水) 19:12:25.31ID:TuAQ3w56
>>355
ありがとございます
それはその通りです

機能ごとに作るのは、仰っている接点をキチンと作ることでもあります。
通信した結果をなんらかのIPC機能を使って業務用のプロセスに通知、逆に業務用のプロセスからの指示を通知するように明示しておきたいのです

一種の責任分界点としての役目もありますね
2020/03/04(水) 19:18:43.16ID:GfItxBVT
そもそも通信タスクとアプリタスクってどっちが親なん?

アプリタスクの常駐処理って何やってるの?
通信タスクに最新データが来たら通知して欲しい?
アプリタスクが通知タスクの受信バッファを定期で確認する?
2020/03/04(水) 19:18:54.88ID:E+0JWbBM
ガガイのガイジ
2020/03/04(水) 19:20:34.90ID:w6hLhDKv
>>347
少なくとも340はそう捉えて、突然罵倒する危ない人なんだなと感じたんだと思うよ
俺は正しく解釈したけど340に対するレスがずれてたんでもしかして340の解釈が正しかったのか?と勘ぐっちゃった
2020/03/04(水) 19:22:05.72ID:uE9oMay2
てか実際にローカル同士の対話なのかそこすらハッキリ情報出してねえだろ
要件の定まらねえフワフワした質問にはフワフワした回答しかこねえよ
2020/03/04(水) 19:30:41.74ID:TuAQ3w56
>>358
親子関係は特に考えていませんね
24時間運用することを想定してます

業務用のプロセスはデバイスの稼働状況とセンシングしてるデータのモニタリング、及びそれらの蓄積。
必要に応じてデバイス(のさらに先にいる装置)に対してある種の指示を行うことを想定してます。

センシングしてるデータはそのまんまではなく、モニタするときには簡単な加工(FFT程度)して表示させるつもりです。

業務用のプロセスは、可能だったらポーリングではなく、イベントドリブンな形で受信を契機に即座に表示してほしいのです。
2020/03/04(水) 19:34:47.36ID:mhPO8lOa
親子なんか意識する必要ないしなあ。
悪いがここ馬鹿ばかりだから相談しても無駄だぞ。
2020/03/04(水) 19:39:28.76ID:x9n6fSic
>>360
現実に誤読された方がいるので表現が良くない点があったのでしょう

ただ、見直しても ど素人… の文言は私が他者に向かって発言している文言だと解釈するのは難しいのではないかと思っています
365デフォルトの名無しさん
垢版 |
2020/03/04(水) 19:47:15.17ID:yCw8CYmc
モノシリですね判ります
2020/03/04(水) 19:48:21.42ID:K/lPlqdw
ちょっと、見返してみましたが、もはやc#そのものとかなり離れた会話になってしまいました

すみません

c#で実装するため、下らない質問でも書いて良いスレと書いてあったので、このスレに書いてしまいましたが、あまり相談するにあたり適切だとは言えない内容となってしまいました

長々とこれ以上続けるのも申し訳ないので、この辺りでやめておくことにします

ご教示頂いた方、ありがとうございました
367デフォルトの名無しさん
垢版 |
2020/03/04(水) 20:07:19.28ID:SkBOTqi1
揚げ足取りだけどmonolithicねw
これおじさん世代に間違って覚えてる人多し
2020/03/04(水) 20:14:20.76ID:4LAYe0JO
>>367
ご指摘ありがとうございます
ははは、恥ずかしい
2020/03/04(水) 20:26:04.25ID:5mLImXyq
>>362
だったら通信開始した時点で他の処理は動いて欲しくないんだから
別プロセスなんかにする必要ないじゃん
問題起きるだけだよ

また通信が途中で死んだとき
途中までダウンロードしたデータどうするの?
また、その後のアプリの動作はどうしたい?(最新が取れるまで完全に止めたい?古いデータで動かしたい?)

とか色々ある仕様を決めて
初めて別プロセスにするって仕様が決まるんであって
わかりにくいから分けちゃったは余計面倒で複雑になっちゃうぞ
別プロセスにしたいなんて受信自体はアプリが死んでても生きててもいつでも動いてほしくてとにかく受信バッファを素早くいつでも処理してほしい的な
要望でもないとやらないよ
2020/03/04(水) 20:37:11.14ID:4LAYe0JO
>>369
そう言う考えもありますね
ありがとうございます
2020/03/04(水) 20:52:38.13ID:Yqjto87s
>>364
いや普通に誤読するだろ
最低でも
> 「ど素人め、定番はこれだ!」って言う回答がすぐにないのは
程度は書かないとわからんよ
そもそも「ど素人め」なんて言う言葉が本当に必要だったのか?
2020/03/04(水) 20:55:56.28ID:5mLImXyq
仮に
通信タスクが通信し受信バッファに溜め込んで
アプリタスクが受信バッファを定期で見に行く造りにした場合

・通信タスク受信バッファ書込中(アプリタスクは受信バッファには触れない)
・アプリタスク受信バッファ読取中(通信タスクは受信バッファには触れない)

上記2つの状態を解消する何らかの仕組みは必要
2020/03/04(水) 21:03:04.11ID:FUOXjc3Y
>>372
そうですね
なんらかの形で排他を行い、リングバッファのような仕組みでデータの受け渡しを行なって、プロセス相互にメッセージを送受信してイベントの発生を通知できたらいいですね。
ありがとうございます
2020/03/04(水) 22:20:56.21ID:yiNVycVp
>>350
機能が違うからプロセス分けるってのはC#では一般的ではないね
ネットワークI/Oを担当する部分と、業務ロジック/UIを担当する部分で機能は違っても
両方存在しないとユースケースが完結できないのであれば一般的には一つのプログラムにする

通信機能を複数のプログラムで共有したい場合だったり
それぞれのプログラムの起動/停止タイミングの違ったり
耐障害性を考慮したプロセス監視要件が違うケースみたいに
プログラムを分ける必要のある要件があれば別

プロセス分ける必要がなければC#の場合はマルチプロセスに比べて
マルチスレッドのほうが道具も揃ってるしシンプルに作れる
2020/03/04(水) 22:27:53.31ID:5mLImXyq
>>372
解消じゃなくて実現だったw

書いてるうちに逆に書いてそのままだったすまんこ
2020/03/04(水) 22:30:17.84ID:GUfzIi7v
UI使わない時(ログオフ時)でも常に通信してる必要があるなら
通信部だけ独立させてサービス化することはあるな
2020/03/04(水) 22:39:38.18ID:yiNVycVp
プロセス間通信は.NET FrameworkならWCFを使うのが一般的だった
(他は.NET RemotingやIpcChannelとか)

ただ.NET Coreだと上の3つはサポートされてないから
標準でとなるとNamed PipeかSocket、あとはHTTPサーバーを立てるくらい
どれ使ってもWCFと違って型付きでデータをやり取りできないので
マーシャル/アンマーシャルは外部ライブラリ使ったりして追加実装する必要がある

ローカル限定ならまずはNamed Pipeから考える
通信用プロセスと業務用プロセスが別のマシンで稼働する可能性があったり
それぞれ別の理由でスケールしていく可能性があるなら
少し大げさだけどRabbitMQみたいなメッセージングも選択肢として検討するかな
2020/03/04(水) 22:40:48.64ID:5mLImXyq
>>374
スレッドセーフのサンプル探すのが楽だよね
プロセス間通信のサンプル探すよりはいいと思う

書込中と読取中の2つのガードが必要なのに片方しかやってないのが多い
それも仕方ない話でこれ以上は詳細な仕様決めが必要になる
2020/03/04(水) 22:45:34.67ID:Tg1eDdkO
>>377
gRPCじゃね?
2020/03/04(水) 23:06:44.84ID:yiNVycVp
>>379
gRPCも選択肢としては考えるけど
ローカル限定のプロセス間通信なら大げさすぎる気がするし
リモートも考慮するなら業務プロセスが死んだ時の対応とかで
メッセージングにしといたほうが信頼性が高い
2020/03/04(水) 23:36:06.22ID:ITD9wOqz
ローカル限定ならMSMQが楽だけどね
パフォーマンス的にOKかどうかは要件次第。

DCEは悪用されまくってセキュリティー強化
で既存ソースが動かないってのはあるが、
スレッド生成から含めてランタイムが面倒見てくれるので便利。
2020/03/04(水) 23:37:26.09ID:FUOXjc3Y
皆さま

追加でご教示ありがとうございます
2020/03/04(水) 23:54:13.27ID:nNNW6i++
Ruby では、

IO の派生クラスが、抽象クラスのBasicSocket で、
その具象派生クラスに、TCPSocket/TCPSserver, UDPSocket, UNIXSocket/UNIXServer がある。
TCP/UDP, UNIX ドメインのストリーム型ソケット

socket は、プロセス外部との通信 (プロセス間通信、インターネット) を実現します

直接HTTP を扱わず、TCP で書くことも出来るが、
HTTP 以外でも、TCP を使うプロトコルは、TCP で書くことも出来るが、

普通は、ほとんどのプロトコルで、既に公開されたライブラリを使う、と書いてある。
つまり、これらを使って自分で書くことはない

HTTP などの既に公開されたライブラリを使う!
2020/03/04(水) 23:58:55.88ID:ITD9wOqz
ちくわ大明神
2020/03/05(木) 00:13:16.01ID:eAZwhj1s
現れたなRuby妖怪…
2020/03/05(木) 10:52:16.03ID:BSkbts2i
>>374
>両方存在しないとユースケースが完結できないのであれば一般的には一つのプログラムにする

それは機能分割できてないだけでは?
別レイヤとして処理を依頼する、その結果を受け取るで済む話のような?
2020/03/05(木) 12:40:03.16ID:TOZ2Advl
mqttとか
2020/03/06(金) 04:08:23.78ID:4zsVrvlG
C#でpandasに相当するのてDataTableですか?
2020/03/06(金) 10:32:43.31ID:3H/1PUe0
DataGridView の DataSource として List をバインドすると完了までに時間がかかる(List の Item 数が約816万件ある)ので、
徐々に追加・表示されるようにしたいのですが、どうすればよいでしょうか。
2020/03/06(金) 10:53:44.65ID:+Or8jz1j
バインディングはあきらめて仮想モード
http://home.a00.itscom.net/hatada/csharp/datagridview02.html
まあ816万件のほうをなんとかすべきだけどね
391デフォルトの名無しさん
垢版 |
2020/03/06(金) 12:12:19.81ID:zx4TP0wl
816万件表示して全部目で見るのかって話だな
2020/03/06(金) 14:50:23.81ID:FB3Rm5f4
たしかに800万件を全てバインドしてしまうという考え方が乱暴かもね。
そうすれば楽だとは思うけど、別の方法を考えた方が良いと誰に聞いても言うんじゃないかな
393デフォルトの名無しさん
垢版 |
2020/03/08(日) 17:03:53.86ID:NoMbfY/N
質問です。
Adaptive Code 第2版を読んでいるのですが、
SQLを用いたサンプルプログラムの実行がうまくいかず、困っています。
サンプルは以下のものを使用しています。
https://github.com/AdaptiveCode/AdaptiveCode/tree/master/Chapter12/ch12-b_st_rd-injection/DependencyInjectionWpf

SQL Serverとの接続をする部分で例外を出します。
具体的には、以下のソースファイルの26行目です。
https://github.com/AdaptiveCode/AdaptiveCode/blob/master/Chapter12/ch12-b_st_rd-injection/DependencyInjectionWpf/ServiceImplementations/TaskServiceAdo.cs

エラーメッセージは、以下のとおりです。

System.Data.SqlClient.SqlException: 'SQL Server への接続を確立しているときに
ネットワーク関連またはインスタンス固有のエラーが発生しました。
サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、
および SQL Server がリモート接続を許可するように構成されていることを確認してください。
(provider: Named Pipes Provider, error: 40 - SQL Server への接続を開けませんでした)'

動作環境はWindows 10、Visual Studio Community 2019です。
SQL Server Express 2016 LocalDB はVSと同時にインストールしてあります。

解決策をご教示いただきたく、よろしくお願いします。
2020/03/08(日) 17:44:31.79ID:K4cIg85y
>>393
using(var connection = new SqlConnection(settings.GetSetting("TaskDatabaseConnectionString"))){
この次の行で止めてconnection.ConnectionStringの値を確認してみ
LocalDBしかインストールしてないなら接続文字列は "(LocalDB)\{LocalDBインスタンス名}" みたいな形式でないと接続できないよ
このあたりを参考にしてね
https://blog.clock-up.jp/entry/2016/07/27/vs-sqlserver-localdb
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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