1

C# で Windows 8 用に記述されたデスクトップ アプリケーションを使用して、クリップボード上のさまざまなデバイス センサーの読み取り値を提供しています。ここで、アプリケーションが対話する外部アプリケーション (その構造を制御することはできません) があります。どちらのアプリケーションも、相互テキスト ファイルをスイッチとして使用します。外部アプリが読み取り値を必要とする場合、テキスト ファイルの名前を「SensorsTurn.txt」に変更し、("sensors") などのトリガー ワードをクリップボードに配置します。トリガー用のクリップボード、それに応じてデータを収集し、それをクリップボードに置き、テキスト ファイルの名前を「RBsTurn.txt」に戻します。問題は、プログラムが実行されている限り、そのファイルの名前を継続的にチェックする必要があることです。私が考えた非常に基本的な方法の 1 つは、プログラムを無限 while ループに入れることでした。しかし、それは明らかに非常に悪いアプローチです。タスク マネージャーで自分のアプリケーションを表示すると、CPU 処理を異常なほど消費してしまいます。私が見つけた別の提案は、ループをバックグラウンド スレッドにすることでした。これはもう少し効率的でした。ただし、2 つの連続した読み取り間の時間は遅くなります。私が働いている人は次のように報告しました:「初めてクリップボードに書き込もうとすると、非常に速く書き込めますが、その後の書き込みでは約 3 秒かかります (クリップボードと通信する 2 つのプログラムがよくありました)。あなたのプログラムが何らかの方法でクリップボードを解放していない. クリップボードに書き込めるようになるとすぐに、ファイル名を変更してデータをすぐに取り戻します.

namespace sampleApplication
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    //Initialize sensor variables
    LightSensorReading _newLightSensorReading;
    LightSensor _LightSensor = LightSensor.GetDefault();

    string _pathString = System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "dummy");
    private void Form1_Load(object sender, EventArgs e)
    {
        //InitializeDevices();
        System.IO.Directory.CreateDirectory(_pathString);
        string _filePathSensors = System.IO.Path.Combine(_pathString, "SensorsTurn.txt");
        string _filePathRBsTurn = System.IO.Path.Combine(_pathString, "RBsTurn.txt");
        string _triggerString = "";
        int x = 1;
        Thread th = new Thread(() =>
            {
                while (x == 1)
                {
                    if (System.IO.File.Exists(_filePathSensors))
                    {
                        _triggerString = Clipboard.GetText();
                        switch (_triggerString)
                        {
                            case "sensors":
                                if (_LightSensor != null)
                                {
                                    _newLightSensorReading = _LightSensor.GetCurrentReading();

                                    string _deviceReading = "LightSensor" + "," + _newLightSensorReading.IlluminanceInLux.ToString();
                                    Clipboard.SetText(_deviceReading);
                                    System.IO.File.Move(_filePathSensors, _filePathRBsTurn);
                                }
                                break;
                            case "stop":
                                Clipboard.Clear();
                                System.IO.File.Move(_filePathSensors, _filePathRBsTurn);
                                Application.Exit();
                                break;
                        }
                    }
                }
            });
        th.IsBackground = true;
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
    }
}
}

簡単に言うと、2 つの問題があります。1) 非効率な無限ループを使用せずにファイル名を継続的にチェックする方法は? どうにかしてイベントを定義できますか?? 2) 私のプログラムは、クリップボードを使用した後、十分な速さでクリップボードを解放しません。その理由は何ですか?

4

5 に答える 5