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) 私のプログラムは、クリップボードを使用した後、十分な速さでクリップボードを解放しません。その理由は何ですか?