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

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

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

全過去ログを検索

<< 0 >>
■9663  Re[8]: System.Timers.Timerでのイベント処理
□投稿者/ れい -(2007/11/01(Thu) 19:10:22)
    No9656 (mあ@反省中 さん) に返信
    > 再入嫌なら、タイマーイベントが発生したら、止めればいいだけなのでは?

    これはダメな発想ですね。
    タイマーイベントが発生してから止めるまでの間に、
    もう一度イベントが発生する可能性がありますから。

    サービスなので、
    System.Windows.Forms.Timerを使うのもよしたほうがよいでしょうね。
    できないことはないですが、
    system.windows.forms.dllはでかいので、
    無駄にメモリを喰うこともないでしょう。

    スレッドモデルとIOモデルで分類すると、一般に4つの選択肢があります。

    1 シングルスレッドで同期IO
    2 シングルスレッドで非同期IO
    3 マルチスレッドで各スレッドが同期IO
    4 マルチスレッドで各スレッドが非同期IO

    最初のは普通ですね。
    ファイルアクセスは一般に遅いので、その間はスレッドが止まります。
    スループットは小さいですが、無駄な処理は一切ありません。
    そういう意味では最も効率的です。

    2番目が理論上は最も高速にできます。
    PCをこのプロセスが占有してよいなら、最速です。
    管理する状態が増えてくるとプログラミングが大変になってきます。

    3番目は仕事を分けられるときの手法です。
    スレッド切り替えのコストがありますから、2よりは重くなります。
    同期機構をちゃんといれないとダメです。

    最後のはHTTPサーバーなどで使われる手で最も大変です。
    マルチコア・マルチスレッドなPCではかなり早いですし、
    大規模なものではこれを使わないと開発が激しく大変になります。

    よく無駄にスレッド数を増やしてしまう人がいますが、
    最近のまともなOSは非同期IOがありますから、
    本来スレッドなど無くてもIO待ちのないプログラムが作れます。
    スレッドを使ったほうが開発が楽な場合のみ、使うべきです。


    具体的にどんな監視なのか分かりませんが、
    クライアントPCでフォルダ監視をするサービスなら、
    ユーザーが重く感じないように動いていて欲しいのではないでしょうか。
    であるなら、PCへの負荷が小さく、トータルで最も効率のよい
    シングルスレッド同期ファイルアクセスが最高であろうと思われます。
    速度が足りないときはファイルアクセスを非同期にして増やすのがいいでしょう。

    監視をシングルスレッドでやるなら、
    ワーカースレッドで時刻を監視して、
    定期的に処理するのが一番楽で軽いですね。
    Sleepは重くないですし、それほどいい加減でもないので。

    System.Timers.Timerを使いたいなら、
    シングルスレッド化しないといけません。
    ロックオブジェクトをいれてクリティカルセクションを構成したり、
    専用のワーカースレッドを用意し、
    Timerイベントからワーカースレッドへ、
    イベントを通知するのが普通かと思います。

    再入フラグ用integer or booleanを一個用意。
    Timerイベント先頭でInterlockedクラスを用いてinteger型をチェック。
    再入してるなら何もせずに帰る。
    再入してないなら監視タスクを実行。
    監視タスクが終わったら再入フラグをクリア。

    もしくは。

    AutoResetEventを用意。
    TimerイベントではEventをセットするだけ。
    ワーカースレッドはEventを待つ。
    イベントが通知されたら監視タスクを実行。
    監視タスクが終わったらまたAutoResetEventを待つ。

    という感じでしょうね。
記事No.9602 のレス /過去ログ22より / 関連記事表示
削除チェック/

■34740  Re[1]: みなさま〜お久しぶりです!
□投稿者/ 倉田 有大 -(2009/04/08(Wed) 00:31:13)
    お帰りなさい。
    一緒にXAMLましょう!

    極論ですが、営業とプログラマー分ける意味がわかんないんだけどね。(´・ω・`)プログラム組めて、営業も一緒に出来る方が話が早い。
記事No.34739 のレス /過去ログ61より / 関連記事表示
削除チェック/

■53729  Re[2]: 起動中のフォルダの情報を列挙したい
□投稿者/ ちゃっぴ -(2010/09/25(Sat) 14:06:22)
>
    解放処理書くのめんどくさいですが、COM 「Microsoft Internet Controls」 を使ってできます。
    以下めんどくさいので、Excel VBA でちょろっと書いた code。

    Dim windows As SHDocVw.ShellWindows
    Dim window As SHDocVw.IWebBrowser2

    Set windows = New SHDocVw.ShellWindows
    For Each window In windows
    If window.FullName = "C:\Windows\explorer.exe" Then
    Debug.Print window.LocationURL
    End If
    Next

    C# に変換してお使いください。
記事No.53715 のレス /過去ログ90より / 関連記事表示
削除チェック/

■54867  Re[3]: 「ユーザーの切り替え」か判断するには?
□投稿者/ 魔界の仮面弁士 -(2010/11/07(Sun) 17:23:38)
    No54863 (C#初心者 さん) に返信
    > 言葉足らずで申し訳ありません。
    Azulean さんの質問の繰り返しになりますが、『なぜ、それが必要なのでしょうか?』


    > つまり、パスワードを入力しなければログオンできない状態で、内部では処理を実行している・・・という状態。
    「内部では処理を実行している」というのは、何を指していますか?
    (起動直後で誰もログオンしていなくとも、サービスは既に起動開始されていますよね)

    パスワード入力画面(Winlogonデスクトップ?)が出ている状態としては、
     (a) まだ誰もログオンしていない状態
     (b) 誰か一名がログオンしている状態
     (c) 複数の異なるユーザーが同時にログオンしている状態
     (d) 複数の同じユーザーが同時に複数のセッションを開いている状態
    といったパターンが想像されます。

    「かつログオンしているユーザーが作業している状態」ということは、
    上記のうち a は除外するという事でしょうけれども、その段階であっても、
    複数のユーザーが作業中である可能性があるわけですよね。


    ログオンセッションについて調べるだけならば、Win32_LogonSession クラスなどで
    得ることができそうですが、パスワード(あるいは生体認証等も含む)入力画面の
    処理中かどうかを調べるとなると、GINA や ICredentialProvider などを
    実装する事になるかもしれません。
    http://msdn.microsoft.com/ja-jp/magazine/cc163489.aspx
記事No.54849 のレス /過去ログ92より / 関連記事表示
削除チェック/

■55426  Re[2]: ConnectionからTransactionを知る方法
□投稿者/ furu -(2010/12/01(Wed) 14:47:04)
    No55425 (shu さん) に返信
    > ■No55423 (furu さん) に返信
    > コネクションに対しトランザクションが1つとは限らないので無理でしょう。
    
    返信ありがとうございます。
    
    Oracle等では、並列トランザクションをサポートしておらず、
    コネクションに対しトランザクションが1つなので可能だと思っています。
    
    実際には、トランザクションリスト(or 配列)なるものが取得できれば
    1つであることを確認し、使用したいと思っています。
    
    例:
      void InsertData(
              DbConnection    Conn,
              DbTransaction   Tran)
      {
          using (DbCommand Comm = Conn.CreateCommand())
          {
              Comm.Transaction = Tran;
              Comm.CommandText = "insert into a values(5)";
              Comm.ExecuteNonQuery();
          }
      }
    
      【やりたい事】
      void InsertData(
              DbConnection    Conn)
      {
          using (DbCommand Comm = Conn.CreateCommand())
          {
              if (Comm.TransactionList.Count != 1)
                  throw null;
      
              Comm.Transaction = Comm.TransactionList[0];
              Comm.CommandText = "insert into a values(5)";
              Comm.ExecuteNonQuery();
          }
      }
    
記事No.55423 のレス /過去ログ93より / 関連記事表示
削除チェック/

■57527  Re[1]: Datagridview カレント行の値を変更
□投稿者/ おさる -(2011/03/03(Thu) 11:11:31)
    No57410 (hs さん) に返信

    > Datagridviewのカレント行のみの値を変更する方法が判りません。
    >
    > カレント行の変更時には値を変更できるのですが、
    > 行がカレント行でなくなった時に元に戻す方法が判りません。

    この質問内容では、全く内容が理解できないので、回答はつかないと思うよ。
    「値を変更」とか、「元に戻す」とか色々なキーワードがあるが、
    どのように関連しているのか、何をしたいのかが分からない。
記事No.57410 のレス /過去ログ96より / 関連記事表示
削除チェック/

■83693  Re[13]: 巨大なバイナリファイルを高速で出力する方法
□投稿者/ なちゃ -(2017/04/03(Mon) 10:26:36)
    FileStreamは、同時に同じファイルに出力されることについて何も制御を行いません。
    ですので、複数のスレッドから同時に書き込みを行うと、当然書き込みが競合してファイル内容が混ざるなどの不都合が発生します。
記事No.83674 のレス /過去ログ143より / 関連記事表示
削除チェック/

■86494  LIST内容をファイル出力したい
□投稿者/ kirin -(2018/02/06(Tue) 19:10:28)

    分類:[C#] 

    初めまして。プログラミング初心者です。
    list内容をテキストファイルに出力したいと思って以下のコードを書きました。
    実行してコンソールから適当にカレーやラーメンを入力してもファイルの中が
    System.Collections.Generic.List`1[System.String]
    と記載されてしまします。

    どういった点を修正すればいいでしょうか。
    アドバイスをお願いします。

    static void Main(string[] args)
    {
    List<string> lunch = new List<string>();

    while (true)
    {
    string menu;
    Console.WriteLine("終わるにはeを入力");
    menu = Console.ReadLine();
    if (menu == "e")
    {
    foreach(string e in lunch)
    {
    Console.WriteLine(e);
    }
    using (StreamWriter wr = new StreamWriter(@"list.text"))
    {
    wr.WriteLine(lunch);
    wr.Close();
    }
    break;
    }
    else
    {
    lunch.Add(menu);
    }
    }
    }

親記事 /過去ログ148より / 関連記事表示
削除チェック/

■88348  Re[1]: C# PictureBoxクリックで画像切り替えが遅い…
□投稿者/ 魔界の仮面弁士 -(2018/08/22(Wed) 13:23:49)
    No88341 (無理ゲー さん) に返信
    > Format_Picture.Image = Properties.Resources.Format_1;

    Image a = Properties.Resources.Format_1;
    Image b = Properties.Resources.Format_1;

    とした場合、a == b になるかのように思えますが、
    実際には別々のインスタンスになりますのでご注意を。

    今回のような場合には、private Image[] images; なフィールド変数などに
    6 画像すべてを取り込んでおき、それを差し替えた方が良いでしょう。


    なお、リソース画像の取得には、
    Image c = Resources.ResourceManager.GetObject("Format_1") as Image;
    という構文を用いることもできます。


    それと Image である以上、本来は不要になった時点で Dispose を呼ぶ必要があります。
    ガベージコレクト任せにする手段もありますが、廃棄と再生成を頻繁に行う場合には向きません。
    ただし private Image[] images; などに蓄えて使いまわすのであれば、
    画面表示中に Dispose を呼ぶ必要はありません。(アプリ終了時の処分だけで済む)
記事No.88341 のレス /過去ログ152より / 関連記事表示
削除チェック/

■91182  PowerShellで変数の中身を実行させたい
□投稿者/ pe -(2019/06/05(Wed) 20:18:10)

    分類:[.NET 全般] 

    (Get-Process).Companyとやると会社一覧が表示されます。

    $comp = "Company"
    (Get-Process).$comp
    このようにやっても動きます。なぜでしょうか?
    他の言語だと動かないと思うのですが、PowerShellだと何故動くのでしょうか?
親記事 /過去ログ157より / 関連記事表示
削除チェック/

■91203  Re[1]: PowerShellで変数の中身を実行させたい
□投稿者/ Hongliang -(2019/06/06(Thu) 09:48:24)
    > このようにやっても動きます。なぜでしょうか?
    なぜ、と言われると、それができるように設計したからとしか言えないと思いますが…。
    文法解析的には、変数の識別子を$開始と決めたために、メンバ名と識別できるから、その記述を認めても問題なくなった、とか。

    > 他の言語だと動かないと思うのですが
    動的言語では似たような記述が可能なのもそれなりにあるんじゃないでしょうか?
    例えばJavaScriptだと、以下のような記述が可能です。

    let obj = { prop: 'ok', name: 'ng' };
    let name = 'prop';
    console.log(obj[name]); // okが出力される

    // obj.name だとnameがobjのメンバなのか変数なのか区別できないので
    // . 演算子の右辺で変数を使うことはできない
記事No.91182 のレス /過去ログ157より / 関連記事表示
削除チェック/

■91208  Re[1]: PowerShellで変数の中身を実行させたい
□投稿者/ はまぐり -(2019/06/06(Thu) 10:18:21)
    No91182 (pe さん) に返信

    Bashでも同じように動作します
    Bashにはオブジェクトという概念はありませんが
    変数を展開した文字列をコマンドとして実行できます

    PowerShellやBashに共通することはコマンドラインインタプリタであることです
    コマンドラインインタプリタはコマンドを実行することを主目的にしてるので
    言語の用途としてそのようにした方が都合が良かったのじゃないかなと思いました
記事No.91182 のレス /過去ログ157より / 関連記事表示
削除チェック/

■91281  Re[1]: PowerShellで変数の中身を実行させたい
□投稿者/ 魔界の仮面弁士 -(2019/06/11(Tue) 11:37:57)
    No91182 (pe さん) に返信
    > (Get-Process).Companyとやると会社一覧が表示されます。
    > $comp = "Company"
    > (Get-Process).$comp
    > このようにやっても動きます。なぜでしょうか?
    > 他の言語だと動かないと思うのですが、PowerShellだと何故動くのでしょうか?

    System.Dynamic.ExpandoObject クラスや
    System.Dynamic.DynamicObject クラスはご存知でしょうか。
    https://blog.okazuki.jp/entry/20100808/1281239670

    PowerShell のオブジェクト(PSObject / PSCustomObject)は、
    この ExpandoObject に相当する機能を有しているようです。



    たとえば C# で下記を参照設定してみます。
    "C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll"

    そうすると、C# から
     System.Management.Automation.PSObject クラス
    が使えるようになります。
    https://github.com/PowerShell/PowerShell/blob/master/src/System.Management.Automation/engine/MshObject.cs#L48
    https://docs.microsoft.com/ja-jp/dotnet/api/system.management.automation.psobject


    C# ではこの PSObject クラスを
     // using System.Management.Automation;
     // using System.Dynamic;
     // using System.Linq.Expressions;
     var obj0 = new PSObject();
     var obj1 = new PSObject(123);
     var obj2 = new PSObject("OK");
     var obj3 = new PSObject(DateTime.Now);
    のようにして初期化できます。

    上記のコードは、PowerShell にとっては、
     $obj0 = New-Object PSObject;
     $obj1 = New-Object PSObject 123;
     $obj2 = New-Object PSObject "OK";
     $obj3 = New-Object PSObject ([DateTime]::Now);
    にあたりますが、PowerShell の文法上は、
     $obj1 = 123;
     $obj2 = "OK";
     $obj3 = [DateTime]::Now;
    と書くこともできますね。
    (PowerShell 側では、PSObject の存在を意識させないよう隠蔽されていますが)



    そして PowerShell では、プロパティやメソッドを呼び出すために、
     $obj3.Second;
     $obj3.ToShortDateString();
    と直接書くだけでなく、文字列指定で
     $s1 = "Second";
     $s2 = "ToShortDateString";
     $obj3.$s1;
     $obj3.$s2();
    のようにしても呼び出せるような簡易的な文法設計になっていますが、
    内部処理上はいずれも、PSObject の機能を呼び出しているものと考えられます。


    C# から PSObject を直接利用する場合は、
    下記のように書くことで動的なメンバー呼び出しが可能です。

    PSObject obj4 = new PSObject(DateTime.Now);
    dynamic obj5 = obj4;
    textBox1.Text = obj5.Second.ToString();
    textBox2.Text = obj5.ToShortDateString();

    string s1 = "Second";
    string s2 = "ToShortDateString";
    textBox3.Text = obj4.Members[s1].ToString();
    textBox4.Text = obj4.Members[s2].ToString();

    label1.Text = obj4.Properties[s1].Value.ToString();
    label2.Text = obj4.Methods[s2].Invoke().ToString();

    label3.Text = obj4.Members[s1].Value.ToString();
    label4.Text = ((PSMethod)obj4.Members[s2]).Invoke().ToString();
記事No.91182 のレス /過去ログ157より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -