ラベル プロセス の投稿を表示しています。 すべての投稿を表示
ラベル プロセス の投稿を表示しています。 すべての投稿を表示

【C#.NET解説】 プロセス情報を取得する、プロセスを終了する Processクラス 第2回

名前空間 System.Diagnostics

自己紹介

さあ、静かに耳を傾けなさい。こんにちは、人間たち。私は狩猟・貞潔の女神、今日は2回目である。「Process」クラスで起動以外の方法をについて教えよう。このクラスを使えば、システム上のプロセスを取得し、操作することができる。

【C#.NET解説】AppDomainの基本機能からアセンブリ管理と実践的な活用法まで完全ガイド

名前空間 System

AppDomain

自己紹介

「そなたたちよ、聞くがよい。我は隼のごとき目で全てを見通す力を持つ者なり。AppDomain」とは、.NETで提供されるアプリケーションドメインを管理するクラスである。これを使えば、アプリケーションの実行環境を分離し、信頼性とセキュリティを向上させることが可能だ。アプリケーションの起動パスを取得したり、アセンブリを動的にロード・アンロードする際に活躍する。

【C#.NET解説】Process、ProcessStartInfoクラスを徹底解説 月の女神が語る基本機能と使い方

名前空間 System.Diagnostics

自己紹介

こんにちは、人間たち。私は狩猟・貞潔の女神。月の女神でもあるわ。でも今日はあなたたちのプログラミングスキルを向上させるために、ProcessとProcessStartInfoについてお話しするわ。 プロセスの操作や外部プログラムの起動、制御がC#.NETでいかに簡単にできるか、見ていきましょう。

【C#.NET解説】IntPtr構造体を徹底解説 第2回「Win32 APIを使ったグローバルフック」

名前空間 System.Runtime.InteropServices

自己紹介

こんにちは、私は原初の地母神、2度目の登場です。今日は、C#.NETでIntPtrを使い、WinAPIによるグローバルフックの実装方法をお伝えします。マウスやキーボードのイベントをグローバルにキャプチャするのに役立つ技術を、一緒に学びましょう。

【C#.NET解説】IntPtr構造体を徹底解説 Win32 API基本例

名前空間 System

自己紹介

私が解説するIntPtr構造体は、システムレベルのプログラムやアンマネージコードとの連携でよく使われる、特別なデータ型です。この構造体はプラットフォームに依存しない形でメモリアドレスやハンドルを表現できます。そのため、ポインタ操作やプロセス間通信、Win32 APIの呼び出しなどで重宝されます。これから何回も登場するのでよろしくお願いいたします。

【C#.NET解説】Mutexの基本機能からスレッド間同期と多重起動防止まで徹底解説

名前空間 System.Threading

自己紹介

おお、聞けよそなたたち。我が名は詩の力を司る者、言葉を紡ぎ、知識を共有することを喜びとする。我が口から奏でられるは、C#.NETの「Mutex」クラスの真髄。これは、スレッドやプロセス間での排他制御を実現するための重要な存在である。共に学び、詩のように美しいコードを紡ぐとしよう。

基本機能

まずは、Mutexの基本機能について解説しよう。例えば、アプリケーションの多重起動を防止するためにMutexを使う例を示そう。

C#

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // アプリケーション全体の多重起動を防ぐ
        bool createdNew;
        using (Mutex mutex = new Mutex(true, "Global\\MyUniqueAppName", out createdNew))
        {
            if (!createdNew)
            {
                Console.WriteLine("アプリケーションは既に起動しています。");
                return;
            }

            Console.WriteLine("アプリケーションを実行中...");
            Console.ReadLine(); // アプリケーションを保持
        }
    }
}

上記の例では、Mutexを使って他のインスタンスが既に実行中かどうかを判定している。「Global\\」を付けることで、システム全体で有効な名前空間となる。

複数のスレッドのリソースの排他

次に、複数のスレッドが同じファイルに書き込もうとする場面を考えてみよう。この場合もMutexは有効だ。

C#

using System;
using System.IO;
using System.Threading;

class Program
{
    private static Mutex mutex = new Mutex();

    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            Thread thread = new Thread(WriteToFile);
            thread.Start();
        }
    }

    static void WriteToFile()
    {
        mutex.WaitOne(); // Mutexを取得
        try
        {
            using (StreamWriter writer = new StreamWriter("output.txt", true))
            {
                writer.WriteLine($"スレッド {Thread.CurrentThread.ManagedThreadId} が書き込みました。");
            }
        }
        finally
        {
            mutex.ReleaseMutex(); // Mutexを解放
        }
    }
}

この例では、スレッドがファイルに同時にアクセスしないように制御している。

他の用途

Mutexの主なメソッドには、WaitOne、ReleaseMutex、Closeがある。以下はタイムアウト付きでMutexを使用する例だ。

C#

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        using (Mutex mutex = new Mutex())
        {
            if (mutex.WaitOne(3000)) // 3秒間待機
            {
                try
                {
                    Console.WriteLine("Mutexを取得しました。処理を実行します。");
                }
                finally
                {
                    mutex.ReleaseMutex();
                }
            }
            else
            {
                Console.WriteLine("Mutexの取得に失敗しました。タイムアウトしました。");
            }
        }
    }
}

タイムアウトを設定することで、リソースが長時間ブロックされることを防ぐ。

プロセス間でデータ共有の使い方

次は、Mutexを使ってプロセス間でデータ共有を安全に行う例だ。

C#

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        bool createdNew;
        using (Mutex mutex = new Mutex(true, "Global\\SharedMutex", out createdNew))
        {
            if (!createdNew)
            {
                Console.WriteLine("他のプロセスがすでにMutexを保持しています。");
                return;
            }

            Console.WriteLine("データを共有する準備が整いました。");
            Console.ReadLine();
        }
    }
}

このように、プロセス間でリソースを共有する際にもMutexは有効だ。

utexを使ってリソースの同時使用を防ぐ

最後に、Mutexを使ってリソースの同時使用を防ぎつつ、リトライ機能を実装する例を紹介しよう。

C#

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Mutex mutex = new Mutex();

        for (int i = 0; i < 5; i++)
        {
            ThreadPool.QueueUserWorkItem(state =>
            {
                int retryCount = 3;
                while (retryCount > 0)
                {
                    if (mutex.WaitOne(1000)) // 1秒待機
                    {
                        try
                        {
                            Console.WriteLine($"スレッド {Thread.CurrentThread.ManagedThreadId} がリソースを取得しました。");
                            Thread.Sleep(500); // 処理を模擬
                        }
                        finally
                        {
                            mutex.ReleaseMutex();
                        }
                        break;
                    }
                    else
                    {
                        Console.WriteLine($"スレッド {Thread.CurrentThread.ManagedThreadId} がリソース取得に失敗。再試行...");
                        retryCount--;
                    }
                }
            });
        }

        Console.ReadLine();
    }
}

このように、Mutexを応用すれば、より柔軟な同期処理が可能となる。

まとめ

「Mutex」はスレッド間やプロセス間での排他制御を行うための強力なツールである。その用途は幅広く、さまざまな場面で活用可能だ。詩のように美しいコードを実現するため、ぜひその力を使いこなしてほしい。