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

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

記事リスト ( )内の数字はレス数
UpDatebitmapが保存できない(2) | UpDate特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(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からcmdでpingを実行した時の結果(5) | Nomalvb.netでExcelファイル操作(7) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalVB2022でクリスタルレポートが開けない(2) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalDrawstringでの透過文字作成(3) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | 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) | NomalVB.net からAccessDBへの接続(2) | Nomal時間変数(文字列)の扱い(4) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalPictureBoxの画像を連続保存(11) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalラジオボタンの一括設定(7) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalLabelで文字単位の背景色(7) | NomalLableのカラー色を文字変数から変更したい(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalTEXTBOXのプロパティを文字列に(7) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | NomalLoadOptionのパラメータの意味(3) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | NomalDataGridViewの特定セルにボタンを配置する方法(5) |



■記事リスト / ▼下のスレッド
■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]



■記事リスト / ▲上のスレッド
■35111 / 親記事)  フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(11回)-(2022/07/26(Tue) 13:31:15)
  • アイコン環境/言語:[VS2013] 
    分類:[.NET] 

    お疲れ様です。度々の投稿で申し訳ございませんが、おおしえくださいませ。

    先の投稿(読み出し元フォームの位置取得方法)でご教示頂き、「出来る!」と思って進めてたのですが・・・
    半透明のフォームを親フォームに重ねて表示したいのですが、半透明(Opacity)を設定すると、フォームに載せたコントロールごと半透明となってしまいます。
    添付の画像の様に「フォームだけを半透明」する方法はありませんでしょうか??
    ちなみに添付画像は半透明のフォームだけを重ねて表示し、別のOpacity=100%のフォームをさらに重ねております。
    (親フォームを合わせて3フォームを重ねています)
    出来るには出来るのですが、コードが煩雑になりますので、何か良い方法は無いかと模索しております。

    お忙しいとは思いますが、宜しくご教示のほどお願いいたします。
804×601 => 250×186
イメージ
1658809874.png
/18KB
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35112 / ResNo.1)  Re[1]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1438回)-(2022/07/26(Tue) 14:50:11)
  • アイコンNo35111に返信(よっし〜さんの記事)
    > 添付の画像の様に「フォームだけを半透明」する方法はありませんでしょうか??

    タイトルなし枠無しの Form の背景色を、普段使わない色にしておき、
    その色を TransparencyKey に指定すれば、フォーム部が全透過状態の
    「コントロール部だけのフォーム」ができあがります。
    https://dobon.net/vb/dotnet/form/transparencykey.html

    そのフォームを、Opacity プロパティを設定した別フォームの手前に配置すれば
    フォームの数を 3 つから 2 つに減らせると思います。
    https://dobon.net/vb/dotnet/form/opacity.html


    > フォームに載せたコントロールごと半透明となってしまいます。
    TransparencyKey や Opacity は、フォーム全体に対して一括適用されるため
    コントロール部のみを除外するといったことはできません。

    フォーム 1 つのまま、部分的な半透明化を実現するためには、
    UpdateLayeredWindow API を直接呼び出す必要があります。

    フォームサイズが固定なのであれば、フォームサイズの PNG ファイルを用意し、
    あらかじめその画像内の透明度情報で、不透明箇所と半透明箇所を塗り分けます。
    それを UpdateLayeredWindow API に渡して適用すればできます。

    https://wiki.onakasuita.org/pukiwiki/?UpdateLayeredWindow
    https://dobon.net/vb/bbs/log3-44/26446.html


違反を報告
引用返信
■35113 / ResNo.2)  Re[2]: フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(12回)-(2022/07/26(Tue) 15:50:12)
  • アイコンNo35112に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様、毎度お世話になり、申し訳ございません。

    > タイトルなし枠無しの Form の背景色を、普段使わない色にしておき・・・
    > フォームの数を 3 つから 2 つに減らせると思います。
    現在も親の上に半透明シート(?)を表示させ、その上にLabelを配置したフォームを表示させております。

    > フォーム 1 つのまま、部分的な半透明化を実現するためには、UpdateLayeredWindow API を直接呼び出す必要があります。
    > フォームサイズが固定なのであれば、フォームサイズの PNG ファイルを用意し、
    > あらかじめその画像内の透明度情報で、不透明箇所と半透明箇所を塗り分けます。
    > それを UpdateLayeredWindow API に渡して適用すればできます。
    記載先をお教え頂きましたが、なかなかのボリュームですね。
    まぁ簡単にできない事は分かっておりますので、ちょっとゴリゴリと試してみたいと思います。

    まずは御礼まで・・どうも有り難うございました。


1044×727 => 250×174
イメージ
20220726153947-min.png
/14KB
違反を報告
引用返信
■35114 / ResNo.3)  Re[3]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1439回)-(2022/07/26(Tue) 16:42:28)
  • アイコン
    No35113に返信(よっし〜さんの記事)
    > 現在も親の上に半透明シート(?)を表示させ、その上にLabelを配置したフォームを表示させております。
    
    半透明シートを被せて、下の親フォームを操作不能にしたいという意図でしょうか。
    
    であれば、親フォームにフォームサイズの Panel を全体表示しておき、
    その Panel の背景に、親フォームの内容を描画してはどうでしょう。
    
    
    (1) 親フォームに Panel1 を配置。これが半透明モドキになる。
     Panel1 は普段、Visible = False にしておく。
    
    (2) その Panel1 内に、子コントロールとして黄色の Panel2 を置き、
     Panel2 内に Label1 や Button1 を置く。
     Button1_Click のイベントにて「Panel1.Hide()」を記述。
    
    (3) 半透明表示のために、以下を実行。
    
    'Panel1 は Visible = False な状態で開始する事
    Panel1.Visible = False
    
    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Dim bmp As New Bitmap(cr.Width, cr.Height)
    Using g = Graphics.FromImage(bmp)
        '画面キャプチャ
        g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
        '半透明のスモークをかける
        Using b As New SolidBrush(Color.FromArgb(180, Color.DarkSlateGray))
            g.FillRectangle(b, cr)
        End Using
    End Using
    
    'Panel1を重ねて表示
    Dim oldBmp = Panel1.BackgroundImage
    Panel1.BackgroundImage = bmp
    If oldBmp IsNot Nothing Then
        oldBmp.Dispose()
    End If
    Panel1.BringToFront()
    Panel1.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
    Panel1.Visible = True

違反を報告
引用返信
■35115 / ResNo.4)  Re[4]: フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(13回)-(2022/07/27(Wed) 12:14:45)
  • アイコンNo35114に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様、早速のご教示、有り難うございます。
    > 半透明シートを被せて、下の親フォームを操作不能にしたいという意図でしょうか。
    > であれば、親フォームにフォームサイズの Panel を全体表示しておき、
    > その Panel の背景に、親フォームの内容を描画してはどうでしょう。
    そうです。まさにそうです。
    先の投稿の画面はサンプルで親フォームはスッキリしておりますが、実際の親フォームはゴチャゴチャしておりますので、
    予めパネルを貼らずに、動的に貼る様にしたいと思います。
    今後の為に、サンプルだけ貼らして頂きます。
    どうも、有り難うございました。

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Dim bmp As New Bitmap(cr.Width, cr.Height)
    Using g = Graphics.FromImage(bmp)
    '画面キャプチャ
    g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
    '半透明のスモークをかける
    Using b As New SolidBrush(Color.FromArgb(180, Color.DarkGray))
    g.FillRectangle(b, cr)
    End Using
    End Using

    Dim Pnl As New Panel
    Pnl.Parent = Me

    'Panel1を重ねて表示
    Dim oldBmp = Pnl.BackgroundImage
    Pnl.BackgroundImage = bmp
    If oldBmp IsNot Nothing Then oldBmp.Dispose()
    Pnl.BringToFront()
    Pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
    Pnl.Visible = True
    Form4.ShowDialog(Me)
    Pnl.Visible = False
    Pnl.Dispose()
    End Sub


解決み!
違反を報告
引用返信
■35116 / ResNo.5)  Re[5]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1440回)-(2022/07/27(Wed) 13:50:17)
  • アイコンNo35115に返信(よっし〜さんの記事)
    > Form4.ShowDialog(Me)
    ShowDialog 後の Dispose の呼び出しが漏れているように見えました。
    https://dobon.net/vb/dotnet/form/showform.html

    Show の場合は、フォームが閉じられた時に自動的に Dispose され、メモリ上からアンロードされますが、
    ShowDialog の場合は、使用後に Dispose しないと、閉じられた後もメモリ上に残り続けます。


    それともあえてこの時点では Dispose しないようにしてあるだけで、
    別の場所で Dispose する仕様にしてあるのでしょうか。


    > Dim Pnl As New Panel
    > Pnl.Parent = Me
    > Dim oldBmp = Pnl.BackgroundImage

    これは冗長でしょう。

    新規パネルを、その都度生成するのであれば、
    上記の oldBmp は、常に Nothing ですよね。


    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Using bmp As New Bitmap(cr.Width, cr.Height)
      Using g = Graphics.FromImage(bmp)
        g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
        Dim alpha As Integer = 255 * 80 \ 100 '不透明度 80%
        Using b As New SolidBrush(Color.FromArgb(alpha, SystemColors.AppWorkspace))
          g.FillRectangle(b, cr)
        End Using
      End Using
      Using pnl As New Panel()
        pnl.Parent = Me
        pnl.BackgroundImage = bmp
        pnl.BringToFront()
        pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
        pnl.Visible = True

        'Using child As New Form4() With {.StartPosition = FormStartPosition.CenterParent}
        '  child.ShowDialog(Me)
        'End Using
        Form4.ShowDialog(Me)

        Me.Controls.Remove(pnl)
      End Using
    End Using
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -