DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal画面遷移(モーダルとモードレス)(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | Nomalvb.netでExcelファイル操作(7) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalDrawstringでの透過文字作成(3) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | NomalLoadOptionのパラメータの意味(3) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | NomalCommandBuilderによって作られるCommandTextの内容(5) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | NomalC# NASでのプログレスバー有りのコピー(0) | Nomal正規表現で文字の繰り返しパターン(4) | NomalDataViewのFindRowsde(7) |



■記事リスト / ▼下のスレッド
■35135 / 親記事)  特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(1回)-(2022/08/24(Wed) 21:33:40)
  • アイコン環境/言語:[Windows10] 
    分類:[.NET] 

    インストーラーを作成して、社内の人に配布をして利用していただいております。
    100人以上の方に問題なく使っていただけてますか、1名だけ「パディングは無効なので削除できません」とエラーが発生します。
    アンインストール→インストールを何度か試していただきましたが改善せず
    再度インストーラーを作り直して、インストールしてみましたが改善できませんでした。

    コード内に暗号化/復号の処理があるため、そこでのエラーと思われますが、特定のPCだけで発生しているため、全く原因がわからない状態です。

    皆様にお力添えいただきたく、よろしくお願いいたします。
450×167 => 250×92
イメージ
1661344420.png
/16KB
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■35138 / ResNo.2)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1446回)-(2022/08/25(Thu) 02:12:25)
  • アイコンNo35137に追記(魔界の仮面弁士の記事)
    > 参考情報としてこのあたり。
    > https://social.msdn.microsoft.com/Forums/security/ja-JP/fbd89c41-0af8-4b1a-8106-fa9a69e4488b/24489214952127012395123881235612390?forum=vbgeneralja

    もう一つこの辺りの回答も。手前味噌ですが。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=78391&KLOG=133
違反を報告
引用返信
■35139 / ResNo.3)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(2回)-(2022/08/26(Fri) 13:11:37)
  • アイコンNo35137に返信(魔界の仮面弁士さんの記事)

    ご回答ありがとうございます。
    URLを参照してパディングに意味がわかりました。

    暗号化/復号は下記のURLの内容をそのまま使用しています。
    https://dobon.net/vb/dotnet/string/encryptfile.html

    上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?

    エラー画面の詳細のキャプチャも添付させていただきます。

    恐れ入りますが、よろしくお願いいたします。

1184×160 => 250×33
イメージ
1661487093.png
/14KB
違反を報告
引用返信
■35140 / ResNo.4)  Re[3]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1447回)-(2022/08/26(Fri) 15:00:58)
  • アイコンNo35139に返信(わっしーさんの記事)
    > エラー画面の詳細のキャプチャも添付させていただきます。
    Visual Basic をお使いのようですね。では VB の文法で回答します。


    > 暗号化/復号は下記のURLの内容をそのまま使用しています。
    > https://dobon.net/vb/dotnet/string/encryptfile.html
    そのページには複数の実装がありますよね…?
    今回はスタックトレースを貼って頂いたので、

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption1
    Sub DecryptFile(sourceFile As String, destFile As String, key As Byte(), iv As Byte())

    ではなく

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption5
    Sub DecryptFile(sourceFile As String, destFile As String, password As String)

    の方であることは分かりましたが、もう少し具体的に示して欲しかったです。
    (サイトでは Shared Sub になっていましたが、Module1 上なので Shared を外しているものと想像)


    ちなみに、.NET Core においては、RijndaelManaged クラスは非推奨とされており、
    かわりに Aes.Create メソッドを使うべきとアナウンスされていたりします。
    もっとも .NET Framework の場合は、 Obsolete にはなっていないのですけれどね。
    (AES と Rijndael の違いについては、ここでは触れずにおきます)

    一応念のため、.NET Framework バージョンも教えてください。


    > 上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?
    どうでしょうね。今ちょっと、検証やコードレビューする余裕が無いのです…。

    ただ、既定のパラメーターの場合、CBC の PKCS#7 パディングになっているはず。


    なのでひとまず、復号側の実装で、
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
    の行を
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更してみてください。


    本当にパディングだけの問題なら、復号後のファイルサイズは 16 の倍数バイトとなり、
    復号されたデータの末尾に最大 16 バイトのゴミデータが付与されるはずです。
    (末尾にゴミが付く点を除けば、暗号化は正しく解除されるはず)

    この末尾データは、16 の倍数に揃えるためのパディングデータであり、
    「末尾 16 バイトがすべて &H10」
    「末尾 15 バイトがすべて &H0F」
    「末尾 14 バイトがすべて &H0E」
    「末尾 13 バイトがすべて &H0D」
      :
      :
    「末尾 3 バイトがすべて &H03」
    「末尾 2 バイトがすべて &H02」
    「末尾 1 バイトが &H01」
    のいずれかになります。
    たとえば元が 0 バイトのファイルであった場合、復号したファイルは
    &H10 のみでパディングされた 16 バイトになるということです。


    もし、末尾が上記いずれのパターンでも無かった場合や、あるいは
    それでも途中でエラーになるようであれば、暗号化されたファイル
    もしくはパスワードのいずれかが破損している事を意味するでしょう。
違反を報告
引用返信
■35142 / ResNo.5)  Re[4]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1448回)-(2022/08/26(Fri) 16:04:40)
  • アイコン2022/08/26(Fri) 16:05:59 編集(投稿者)

    No35140に追記(魔界の仮面弁士の記事)
    > それでも途中でエラーになるようであれば、暗号化されたファイル
    > もしくはパスワードのいずれかが破損している事を意味するでしょう。

    ファイルのサイズが「16 の倍数バイト」であるかどうかを確認する作業は
    『暗号化されたファイルのサイズ』と
    『Padding なしで複号した結果ファイル』の
    両方に対して行ってください。

    暗号データが 16 の倍数バイトでは無い場合は、
    暗号データ自体の破損を意味します。
違反を報告
引用返信
■35143 / ResNo.6)  Re[5]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(3回)-(2022/08/26(Fri) 21:33:41)
  • アイコンNo35142に返信(魔界の仮面弁士さんの記事)
    > 2022/08/26(Fri) 16:05:59 編集(投稿者)

    ありがとうございます。

    .NET Frameworkはバージョン4.6になります。

    すみません、仰る通り、サイトの2つ目の方の暗号化/復号を利用しており
    Module1にPublic Sub で記載しており、別のForm部分から呼び出すようにしています。


     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更して、インストーラーを作成して、エラーが出ているPCで試してみます。

    私のPCではエラーはでないのですが、暗号化されているファイルは16の倍数バイトになっていました。
    エラーが出ているPCで、どうなっているかも確認してみます。


違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35131 / 親記事)  ASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする
□投稿者/ ぺんたごん 一般人(3回)-(2022/08/24(Wed) 15:26:59)
  • アイコン環境/言語:[C# .NET 4.6.x] 
    分類:[ASP.NET] 

    お世話になっております。
    
    表題のとおりですが、外部サーバ(https)のxmlファイルを読み込む
    ライブラリdllを作っています。
    これをWinFormsアプリから使用するとすんなり動くのですが
    ASP.NET WebApi2で作ったREST APIで使用すると
    かなり待った後タイムアウトします。
    →「リモート サーバーに接続できません(ry」
    
    開発環境はプロキシがあり、これを通さないと外部へ接続できないのですが
    WinFormsとWebApiとで動作が変わってしまうのは
    どうすれば対処できるのでしょうか。
    最近のググーるさんは指定した単語にちょっとでも引っかかると
    関係ない雑多な情報も全部拾って来るので苦戦してます。
    
    よろしくお願いいたします

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35132 / ResNo.1)  Re[1]: ASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする
□投稿者/ 魔界の仮面弁士 大御所(1442回)-(2022/08/24(Wed) 16:20:59)
  • アイコンNo35131に返信(ぺんたごんさんの記事)
    > これをWinFormsアプリから使用するとすんなり動くのですが
    > ASP.NET WebApi2で作ったREST APIで使用すると

    プロキシ動作は検証したことがありませんが、.config の
     /configuration/system.net/defaultProxy
    の設定はどうなっていますか。( XmlReader.Create に影響するかは未確認 )

    特に設定していない場合、実行アカウントの OS 設定になるんじゃないかな…?

    WinForms はデスクトップ アカウントでの動作でしょうけれど、
    Web の方はそうではないでしょうし。
違反を報告
引用返信
■35133 / ResNo.2)  Re[2]: ASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする
□投稿者/ ぺんたごん 一般人(4回)-(2022/08/24(Wed) 16:31:44)
  • アイコン返信ありがとうございます

    今回作ってるサービスのweb.configにはプロキシに関する設定は皆無です。
    インターネットオプションのプロキシ設定を引き継いでくれるものと思ってたのですが…

    こちらでもあれから調査を続けていて、
    IISのアプリケーションプールの動作するアカウントでインターネットオプションのプロキシ設定しておかないと
    あかん、という情報を見つけて、これはこれで有用なんですが
    今回VisualStudio+IIS Expressでのデバッグで
    現象が起きてるので、どうしたものかなと悩んでます。
    (この場合ログインしてるWindowsユーザで動作する気がしてます)

    もう少し調べてみます
違反を報告
引用返信
■35134 / ResNo.3)  Re[3]: ASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする
□投稿者/ 魔界の仮面弁士 大御所(1443回)-(2022/08/24(Wed) 19:27:02)
  • アイコンNo35133に返信(ぺんたごんさんの記事)
    > 今回作ってるサービスのweb.configにはプロキシに関する設定は皆無です。
    web.config を設定してみた結果はどうでしたか?
    https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/network/defaultproxy-element-network-settings

    追加の認証が必要な場合はこちら。
    https://qiita.com/kazumeat/items/9c1d7c9f6bb1ffe0951e


    > インターネットオプションのプロキシ設定を引き継いでくれるものと思ってたのですが…
    web.config のプロキシ設定が優先されると思いますが、
    未設定時には OS のプロキシ設定が使われるでしょうね。

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
    HKEY_USERS\<何某>\Software\Microsoft\Windows\CurrentVersion\Internet Settings
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

    https://win2012r2.com/2019/02/12/post-498/
    https://win2012r2.com/2022/05/24/configure-proxy-of-service-account/


    > 今回VisualStudio+IIS Expressでのデバッグで
    > 現象が起きてるので、どうしたものかなと悩んでます。
    UAC が有効な場合は、IIS Express を管理者として実行してみるとか…?

    ※当方未確認です
違反を報告
引用返信
■35141 / ResNo.4)  Re[4]: ASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする
□投稿者/ ぺんたごん 一般人(5回)-(2022/08/26(Fri) 15:15:21)
  • アイコン
    No35134に返信(魔界の仮面弁士さんの記事)
    
    結局アレからは色々試す時間がなかったのですが、
    XmlReader.Createに直接urlを指定するのではなく
    
    var req = WebRequest.Create(url);
    req.Proxy = WebRequest.GetSystemWebProxy(); //これ重要
    var resp = req.GetResponse();
    var xml = XmlReader.Create(resp.GetResponseStream());
    
    で動きました(破棄処理などは省略してます)
    なぜこれをデフォ動作としといてくれないのか…
    よくわかりませんが、とりあえずいったん解決といたします
    
    ありがとうございました
    

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35125 / 親記事)  DatagridViewでファンクションキーを止めたい
□投稿者/ はる 一般人(9回)-(2022/08/23(Tue) 20:26:12)
  • アイコン環境/言語:[Windows10 C# ] 
    分類:[.NET] 

    いつもお世話になります。

    DataGridViewで行を選択し、ファンクションキーの「F4」を押したら
    行削除としているんですが、勝手に並び変わってしまいます。
    DataGridViewの既定のファンクションキーだとか。

    ヘッダクリックの並び替えは残したいのでSortModeは止めれません。

    ファンクションキーの動作を止めることはできませんか?
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35126 / ResNo.1)  Re[1]: DatagridViewでファンクションキーを止めたい
□投稿者/ Hongliang 大御所(632回)-(2022/08/23(Tue) 20:52:31)
  • アイコンhttps://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/default-keyboard-and-mouse-handling-in-the-windows-forms-datagridview-control
    こちらによれば、F4キーはコンボボックス列のセルを編集モードにしてドロップダウンを開く、という機能であり、ソートとは関係ないように見えます。
    実際簡単に試してみると、F4キーを押しても特にソート状態に変化はなく、コンボボックス列の場合は上記リンク先通りに編集モードに入ります。

    > DataGridViewの既定のファンクションキーだとか。
    こちらはどこからの情報でしょうか?
    作成されているアプリケーションにおけるF4キーの機能は、そのアプリケーションで作りこまれているものではないでしょうか。
違反を報告
引用返信
■35127 / ResNo.2)  Re[2]: DatagridViewでファンクションキーを止めたい
□投稿者/ はる 一般人(10回)-(2022/08/23(Tue) 21:07:47)
  • アイコンNo35126に返信(Hongliangさんの記事)
    > https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/default-keyboard-and-mouse-handling-in-the-windows-forms-datagridview-control
    > こちらによれば、F4キーはコンボボックス列のセルを編集モードにしてドロップダウンを開く、という機能であり、ソートとは関係ないように見えます。
    > 実際簡単に試してみると、F4キーを押しても特にソート状態に変化はなく、コンボボックス列の場合は上記リンク先通りに編集モードに入ります。

    すいません、間違えました「F3」です。
    Form_KeyDownで記載しているF3の処理は実行されるんですが、
    おまけに並び替えもされてしまうので、これを止めたいんです。
違反を報告
引用返信
■35128 / ResNo.3)  Re[3]: DatagridViewでファンクションキーを止めたい
□投稿者/ Hongliang 大御所(633回)-(2022/08/23(Tue) 21:18:42)
  • アイコンイベントハンドラ中で
    e.Handled = true
    のようにすれば、既定の処理が行われなくなります。

    なお前掲のページにあるように、DataGridView自身のKeyDownイベントでは編集モードでのキー入力には対応できないのでご注意ください。
違反を報告
引用返信
■35129 / ResNo.4)  Re[4]: DatagridViewでファンクションキーを止めたい
□投稿者/ はる 一般人(11回)-(2022/08/23(Tue) 21:45:15)
  • アイコンNo35128に返信(Hongliangさんの記事)


    できました!ありがとうございました。

解決み!
違反を報告
引用返信
■35130 / ResNo.5)  Re[3]: DatagridViewでファンクションキーを止めたい
□投稿者/ 魔界の仮面弁士 大御所(1441回)-(2022/08/23(Tue) 22:49:26)
  • アイコンNo35127に返信(はるさんの記事)
    >>https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/default-keyboard-and-mouse-handling-in-the-windows-forms-datagridview-control
    > すいません、間違えました「F3」です。
    > Form_KeyDownで記載しているF3の処理は実行されるんですが、
    > おまけに並び替えもされてしまうので、これを止めたいんです。

    .NET Framework 4.7.2 以降において、F3 で並び替えが行われるのを止めるために


    (1) F3 並び替えが行われない ".NET Framework 4.7.1 以下" を用いる
    (2) アプリケーションの構成ファイルの runtime/AppContextSwitchOverrides で
     4.7.2 以降のアクセシビリティの強化を無効化する
    (3) AppContext.SetSwitch メソッドで、4.7.2 以降のアクセシビリティの強化を無効化する

    という選択肢もありますね。
    http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30447


    もっとも今回の対応としては、 Hongliang さんが書かれているように
    e.Handled を使う方が良いでしょうね。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35121 / 親記事)  表示動作が重くなる
□投稿者/ たこ 一般人(7回)-(2022/08/01(Mon) 01:48:55)
  • アイコン環境/言語:[VB.NET、.NET Framework 4.7.2、VS2019] 
    分類:[.NET] 

    いつもお世話になります。

    ネットの通信状態を表示するフォームを作って表示させていますが、
    フォームの表示/非表示を繰り返すと動作が遅くなってしまいます。

    何が原因で問題が起こっているか解らず、お知恵をお貸しください。

    表示/非表示の部分
    -----------------------------------------------------------
      ''' <summary>
      ''' モニターForm
      ''' </summary>
      Private IOM As IOMonitor

      Private _IOMonitor = False

      ''' <summary>
      ''' IOモニター表示設定
      ''' </summary>
      ''' <returns>True:表示、False:非表示</returns>
      Public Overridable Property IOMonitor As Boolean
        Set(value As Boolean)
          _IOMonitor = value
          If _IOMonitor Then
            IOM = New IOMonitor(Me)
            IOM.Show()
          Else
            IOM.Close()
            IOM = Nothing
          End If
        End Set
        Get
          Return _IOMonitor
        End Get
      End Property
    -------------------------------------------

    メインクラスからモニターFormへはイベントで情報を渡しています。
    -------------------------------------------
    #Region "イベント定義"
      Public Delegate Sub DIODataEventHandler(ByVal sender As Object, ByVal e As NetDataEventArgs)
      ''' <summary>
      ''' ネット接続時のイベント
      ''' </summary>
      Public Event NetOpen As DIODataEventHandler
      ''' <summary>
      ''' ネット切断時のイベント
      ''' </summary>
      Public Event NetClose As DIODataEventHandler
      ''' <summary>
      ''' ネットエラー時のイベント
      ''' </summary>
      Public Event NetError As DIODataEventHandler
      ''' <summary>
      ''' データ送信時のイベント
      ''' </summary>
      Public Event SendData As DIODataEventHandler
    #End Region
    -------------------------------------------


    表示/非表示を繰り返す度に少しずつではありますが、メモリの使用容量が増ますので、
    ガーベージコレクションの問題かなと思い、
    GC.Collectとか入れてみましたが、上手く行きませんでした…

    よろしくお願いします。
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35122 / ResNo.1)  Re[1]: 表示動作が重くなる
□投稿者/ Azulean 大御所(532回)-(2022/08/01(Mon) 07:27:41)
  • アイコンNo35121に返信(たこさんの記事)
    > 何が原因で問題が起こっているか解らず、お知恵をお貸しください。
    現時点の情報ではわからないと思います。

    > メインクラスからモニターFormへはイベントで情報を渡しています。
    怪しむとしたらこのあたりでしょうか。

    たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    当てずっぽうで書くならこのくらいにとどまります。
    これではない場合は、フォームのコードやモニタクラスのコードなどの周辺コードも示しつつ、リークの量の数量イメージがわかる情報を共有してください。(〇〇KB など)
違反を報告
引用返信
■35123 / ResNo.2)  Re[2]: 表示動作が重くなる
□投稿者/ たこ 一般人(8回)-(2022/08/01(Mon) 12:21:35)
  • アイコンNo35122に返信(Azuleanさんの記事)
    > ■No35121に返信(たこさんの記事)

    >>メインクラスからモニターFormへはイベントで情報を渡しています。
    > 怪しむとしたらこのあたりでしょうか。
    >
    > たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    IOMonitorの初期化処理は次の様になっており、WithEventsでイベントを取得していますが、Addhandler/RemoveHandlerで書いた方が上手く行くのでしょうか?
    ちなみに今はこの様な形になっています。


    IOMonitor(Form)初期化処理
    -------------------------------------------
      Private WithEvents dc As DIO_LC
      Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)


      Friend Sub New(dc As DIO_LC)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.dc = dc
        DIOName.Text = Strings.Right("000" & Me.dc.Index, 3) & ":" & Me.dc.DIOName & vbCrLf & Me.dc.Place
        Me.Text = Me.dc.Index & ":" & Me.dc.DIOName
      End Sub
    -------------------------------------------

    イベント部処理  複数のスレッドから呼び出される為、Invokeしています。。。
    -------------------------------------------
      Private Sub dc_RecievedData(sender As Object, e As NetDataEventArgs) Handles dc.RecievedData
        If System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(e.Data).Substring(0, 1) = "R" Then
          If Me.InvokeRequired Then
            Me.Invoke(New MonitorInvoke(AddressOf DIO_Disp), sender, e)
            Return
          End If
          DIO_Disp(sender, e)
        End If
      End Sub
    -------------------------------------------

    ちょっと気づきました…

    Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)

    この部分って表示/非表示される度に増えて行く気がします。

    検索したらDelegate.Removeと言うメソッドは見つけました…
    https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2

    …使用例が無く、使い方が全くわかりません^^;
    他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    どこか良い例が載っているサイトとかあれば教えてください。
違反を報告
引用返信
■35124 / ResNo.3)  Re[3]: 表示動作が重くなる
□投稿者/ たこ 一般人(10回)-(2022/08/01(Mon) 18:46:21)
  • アイコンNo35123に返信(たこさんの記事)
    > ■No35122に返信(Azuleanさんの記事)
    >>■No35121に返信(たこさんの記事)
    >

    > この部分って表示/非表示される度に増えて行く気がします。
    >
    > 検索したらDelegate.Removeと言うメソッドは見つけました…
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2
    >
    > …使用例が無く、使い方が全くわかりません^^;
    > 他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    解決しました!
    Azulean様のヒントを元にいろいろ試行錯誤し、次の様にしました。
    どうやらdcが邪魔をして遅くなっていた様です。
    念のため、MonitorInvoke.Remove(Nothing, Nothing)も入れました。(使い方合ってるかどうかは自信が無いですが…^^;

    -------------------------------------------
      Private Sub IOMonitor_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        dc.IOMonitorClose()  '表示/非表示のプロパティがdc側にある為、強制的にFalseにしている
        dc = Nothing
        MonitorInvoke.Remove(Nothing, Nothing)
      End Sub
    -------------------------------------------

    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▲上のスレッド
■35118 / 親記事)  bitmapを複数スレッドで処理したい
□投稿者/ Trans 一般人(1回)-(2022/07/31(Sun) 11:43:32)
  • アイコン環境/言語:[Windows10、C#] 
    分類:[.NET] 

    並列処理に挑戦したく思い、1枚の画像を複数スレッドで加工するテストコードを書きました。
    {
        // 画像をメモリに読み込む
        FileStream fs = File.OpenRead(filename);
        Image img = Image.FromStream(fs, false, false);
        Bitmap bitmap = new Bitmap(img);
    
        //読み込んだ画像を表示する
        PictureBox.Image = bitmap;
        PictureBox.Refresh();
    
        // 縦横サイズを取得
        int w = img.Width;
        int h = img.Height;
    
        Parallel.Invoke(
            () => TransformPixel(bitmap, 0, 1000, w),
            () => TransformPixel(bitmap, 1000, h, w)
        );
    
        //作成した画像を表示する
        PictureBox.Image = bitmap;
    }
    private void TransformPixel(Bitmap bitmap, int start, int end, int w)
    {
        Color pixel;
        for (int y = start; y < end; y++)
        {
            for (int x = 0; x < w; x++)
            {
                // ピクセル加工
                pixel = PixelTrans(bitmap.GetPixel(x, y));
    
                bitmap.SetPixel(x, y, pixel);
            }
        }
    
    }
    
    ファイルから読み込んだ画像の頭1000ラインまでをスレッド1、残りをスレッド2で加工するような感じです。
    実行してみたところ、
    Parallel.Invoke(の行で、
    
    System.InvalidOperationException
      HResult=0x80131509
      Message=Object is currently in use elsewhere.
      Source=System.Drawing.Common
      スタック トレース:
       at System.Drawing.Bitmap.GetPixel(Int32 x, Int32 y)
    
    のようなエラーとなってしまいます。
    同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。
    ご教授をお願いいたします。
    

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35119 / ResNo.1)  Re[1]: bitmapを複数スレッドで処理したい
□投稿者/ Azulean 大御所(531回)-(2022/07/31(Sun) 17:46:52)
  • アイコンNo35118に返信(Transさんの記事)
    > 同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。

    そうですね、1 つの Bitmap を複数のスレッドから触ることはできません。

    LockBits を使ってメモリに展開したものを複数のスレッドで同時に加工することはできるかもしれません。
    https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
違反を報告
引用返信
■35120 / ResNo.2)  Re[2]: bitmapを複数スレッドで処理したい
□投稿者/ Trans 一般人(2回)-(2022/07/31(Sun) 20:55:29)
  • アイコン
    2022/07/31(Sun) 20:55:54 編集(投稿者)
    
    ■No35119に返信(Azuleanさんの記事)
    > ■No35118に返信(Transさんの記事)
    >>同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。
    > 
    > そうですね、1 つの Bitmap を複数のスレッドから触ることはできません。
    > 
    > LockBits を使ってメモリに展開したものを複数のスレッドで同時に加工することはできるかもしれません。
    > https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
    
    なるほど。一旦メモリ展開ですか。
    案内の内容を参考に以下のように直してみたら動いたようです。
    ありがとうございました。
    {
        // 画像をメモリに読み込む
        FileStream fs = File.OpenRead(filename);
        Image img = Image.FromStream(fs, false, false);
        Bitmap bitmap = new Bitmap(img);
    
        //読み込んだ画像を表示する
        PictureBox.Image = bitmap;
        PictureBox.Refresh();
    
        // 縦横サイズを取得
        int w = img.Width;
        int h = img.Height;
    
        // Bitmapをロックする
        Rectangle rect = new Rectangle(0, 0, w, h);
        BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    
        // ピクセルデータをバイト型配列で取得する
        IntPtr ptr = bmpData.Scan0;
        string[] array = new string[3];
        byte[] pixels = new byte[bmpData.Stride * img.Height - 1];
        System.Runtime.InteropServices.Marshal.Copy(ptr, pixels, 0, pixels.Length);
    
        Parallel.Invoke(
            () => TransformPixel(pixels, 0, 99999),
            () => TransformPixel(pixels, 100000, pixels.Length)
        );
    
        // ピクセルデータを元に戻す
        System.Runtime.InteropServices.Marshal.Copy(pixels, 0, ptr, pixels.Length);
    
        // ロックを解除する
        bitmap.UnlockBits(bmpData);
    
        //作成した画像を表示する
        PictureBox.Image = bitmap;
    
    }
    
    private void TransformPixel(byte[] pixels, int start, int end)
    {
        for (int i = start; i < end; i++)
        {
            pixels[i] = (byte)~pixels[i];
        }
    
    }
    

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -

2024/03/03(Sun) 20:26:27 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする