C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■82931  Re[5]: C# キー入力シミュレート PostMessageについて
□投稿者/ 魔界の仮面弁士 -(2017/02/20(Mon) 10:53:26)
    No82930 (telracs さん) に返信
    >>PostMessage 直後の GetLastWin32Error は何を返してきますか?
    >>※要 SetLastError 指定
    > それぞれのPostMessageのあとに
    > int error = Marshal.GetLastWin32Error();
    > MessageBox.Show(error.ToString());
    > で見てみましたが、全部0表示でした

    DllImportAttribute.SetLastError フィールドは true になっていますか?
    (最初の投稿では false でしたよね)


    また、受信側アプリで ChangeWindowMessageFilter を
    あらかじめ呼んでおいた場合はどうなりますか?
    (WM_COPYGLOBALDATA も呼んだ方が良いらしいですが、裏付ける資料が見当たらず)
    http://d.hatena.ne.jp/tekk/20091018/1255881871
記事No.82919 のレス /過去ログ141より / 関連記事表示
削除チェック/

■84330  Re[1]: try...catch.... について
□投稿者/ ぶなっぷ -(2017/06/15(Thu) 09:45:55)
    2017/06/15(Thu) 09:46:48 編集(投稿者)

    要は、関数中で処理を中断せざるを得ない状況が発生し、
    それが1つや2つのパターンではなく、多数存在するということかな?

    この手の話は、はるか昔から、いろいろ議論されているように思います。
    「これだ!」という決定的な方法がないのもまた事実です。
    私が思いつく限りのパターンを並べてみます。

    1) 関数の戻り値パターン
    ErrType Func() // ErrTypeはenum値
    {
    if() return ErrType_A;
    :
    if() return ErrType_B;
    :
    if() return ErrType_C;
    :
    }
    などとして、関数の呼び出し側でエラー内容に応じた処理を行う

    2) do_while パターン
    do
    {
    if() { エラー処理(); break;}
    :
    if() { エラー処理(); break;}
    :
    if() { エラー処理(); break;}
    :
    } while(false);
    1回しか通らない do while を途中でbreakして抜けるパターン

    3) try catchパターン
    try catchパターンもありだと思います。
    ただし、私がやるなら「1) 関数の戻り値パターン」の変形です。
    void Func()
    {
    if() throw new Exception("A");
    :
    if() throw new Exception("B");
    :
    if() throw new Exception("C");
    :
    }
    とし、呼び出し側でtry catchする。
    例外というのは、正常系の処理が続けらず、異常系の処理も関数内で
    決定することができない場合に投げるものだと思うからです。

    自関数内で異常系の処理を確定できるなら、そのようなものは、
    例外処理しなくて良い気がします。

    (例) ファイルアクセスエラー
    File.Open()を呼んでファイルが見つからないと、FileNotFoundException
    が発生します。これが、もし例外発生ではなく、関数内で「見つからない」
    とメッセージボックスを表示する実装だったとすると、正常系で見つから
    ないかもしれないファイルをオープンしにいったときに、メッセージ
    ボックスが邪魔になります。

    見つからないかもしれないファイルをオープンしにいくことが仕様上あり
    得ないなら、関数内でメッセージボックスを表示しても良いわけですが、
    その場合、いちいち内部で例外発生させて、catchしてなんてやるのは、
    回りくどいわけです。
記事No.84328 のレス /過去ログ144より / 関連記事表示
削除チェック/

■87555  Re[4]: ロード中に表示するフォームを別スレッドで
□投稿者/ MTK -(2018/06/05(Tue) 15:30:30)
    No87552 (とっちゃん さん) に返信

    >>・エラーが発生している原因と解決策
    > Task.Run() で作成部分だけスレッドアウトした形にしていますよね?
    > フォームを作成したらタスクが終了してしまうため、
    > そのフォームを作ったスレッドがどこかに行ってしまいます。
    >
    > また、Taskで割り当てされるスレッドは、MTAモードなので、フォーム作成を行うのには向きません。

    なるほど!そういうことだったんですね。
    MTAとSTAのことは知りませんでした。勉強になりました。
    エントリポイントで[STAThread]を宣言していてもTaskで実行するとMTAモードになるんですかね
    スレッドがどこかに行ってしまうのであれば、ロード中フォームのスレッドを維持してやればいいんでしょうか?


    >>発生場所については
    >>TopMenuForm.cs の
    > >>this.formMgr.SetLoadText("会社データロード中..."); // ここでエラー
    >>
    >>というところまでは分かっています。
    >
    > この部分は、await から戻ってきてから動く部分ですよね?

    はい、この部分は戻ってきてから動く部分です。



    > フォームは、STAで動かす必要があり、なおかつそのSTAは、UIスレッドである必要があります。

    フォームはSTAでかつUIスレッドである必要がある というのは、
    フォームはメインスレッドで呼び出す必要があり、Task.Run のような別スレッドで呼び出してはいけないという理解で正しいでしょうか?



    > 詳細は省きますが、UIスレッドを自力で起こせない場合は、

    すいません、ここの部分は自分でも調べてみたのですが、まだ理解できていません。
    UIスレッドを自力で起こせない場合 というのが理解できていないのですが、どういう意味でしょうか?



    > メインスレッド(メインのフォームを作成しているスレッド)でフォームを作り、時間のかかる処理を別スレッドにするほうが構造上は安定します。

    今回の例の場合はどうするべきでしょうか?
    メインスレッドで Aフォームを表示した際に、ロード中フォームを別で前面に出したいのです。
    Aフォームのロード処理を別スレッドにしたとしても、
    Aフォームもロード中フォームもメインスレッドで表示しなければいけないんですよね?



    > 今回のようなプログラムであれば
    >
    > public void InitLoadFormAsync()
    > {
    > loadForm = new LoadScreenForm();
    > loadForm.Show();
    > }
    > private async void OnLoad(object sender, EventArgs e)
    > {
    > SetLoadText( "会社データロード中..." ); // 中身はInvokeではなく直接セットに変える(実装がぐちゃぐちゃで実現できないので省略)
    > await Task.Run( ()=> データロードの時間のかかる処理() );
    > // 処理終了後に何かやりたいなら、ここでやる(ログイン中...に変える?)
    > }
    >
    > という感じにすれば、安定すると思いますよ。
    > 書きなぐりコードなので、自分の都合に合わせて直してくださいね。


    プログラムまでいただいてありがとうございます。
    調べて内容をきちんと理解できるようにしたいと思います。
記事No.87549 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87557  Re[5]: ロード中に表示するフォームを別スレッドで
□投稿者/ とっちゃん -(2018/06/05(Tue) 16:28:25)
    No87555 (MTK さん) に返信

    > エントリポイントで[STAThread]を宣言していてもTaskで実行するとMTAモードになるんですかね

    Taskの中身は別のスレッドで動きます。
    Taskで割り当てられるスレッド(ワーカースレッド)は、MTAで動作しているのでSTAにできません。


    > スレッドがどこかに行ってしまうのであれば、ロード中フォームのスレッドを維持してやればいいんでしょうか?
    平たく言えばそうなりますが、もしそうするなら、Taskではなく、Threadクラスを使って
    長時間維持を前提としたスレッドにする必要があります(メソッド抜けたらなくなったではだめなので)。


    > フォームはSTAでかつUIスレッドである必要がある というのは、
    > フォームはメインスレッドで呼び出す必要があり、Task.Run のような別スレッドで呼び出してはいけないという理解で正しいでしょうか?
    >
    後述していますが、UIスレッドとなるSTAスレッドで動かせばよいとなります(UWPアプリを除く)。

    >>詳細は省きますが、UIスレッドを自力で起こせない場合は、
    >
    > すいません、ここの部分は自分でも調べてみたのですが、まだ理解できていません。
    > UIスレッドを自力で起こせない場合 というのが理解できていないのですが、どういう意味でしょうか?


    UIスレッドは、ウィンドウ(UIオブジェクト)を作成してよいスレッドになります。
    UIオブジェクトは、Windowsメッセージを処理するスレッドでのみ作成ができます。

    Windowsメッセージを処理するとは、メッセージポンプがあるなどの言い方もしますが
    Windows Forms アプリの場合は、Application.Run を呼び出したスレッドを指します。
    (WPFの場合は、Dispatcher.Run(), UWPの場合はUIスレッドを自分で作ることはできない)

    UIスレッドを自力で起こすというのは、具体的には、
    1.Threadクラスを使って、カーネルスレッドを起動する。
    2.内部で、Application.Run() を呼び出してメッセージポンプを稼働する。
    3.適切な処理で終了するように作りこむ。

    という3つを合わせた実装を指します。
    具体的にどうすればいいか?はアプリケーションによるので、実例はあまりありません。



    > 今回の例の場合はどうするべきでしょうか?

    先に乗せたプログラムのようにすればいいと思います。
記事No.87549 のレス /過去ログ150より / 関連記事表示
削除チェック/

■100896  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku -(2022/11/18(Fri) 16:11:54)
    No100893 (ジェイド さん) に返信
    
    COMオブジェクトまったく使わなくなりますが
    こちらではダメなのかなー。
    ※KOZさんの回答見て思いつきました。
    
            private void button1_Click(object sender, EventArgs e)
            {
                Console.WriteLine("開始");
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = @"C:\test.xlsx";
                p.Start();
                p.WaitForExit();
                Console.WriteLine("終了");
            }
    
記事No.100893 のレス /過去ログ176より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -