私はできる限り問題を説明しようとします。OpenGL を使用して C++ CLI (Visual Studio 2010) で設計された GUI があります。
ループがあります。これが実行される (または実行されるべき) です: 1. ファイルから行を読み取り、部分に解析します 2. 一定期間待機関数を呼び出します - この期間中はアクションは実行されません(ただし、GUI は使用可能である必要があります - 緊急停止ボタンなど) 3. 時間が経過したら、ファイルからの行の読み取りに戻ります。
割り込みを使用してCのマイクロコントローラー側でこれを確実に行うことができましたが、ここで同じことを達成する方法がわかりません。私の最初のアイデアは、経過時間のイベントハンドラーが起動したときにタイマーを開始し、読み取り関数を再度呼び出す関数を呼び出すことでした。しかし、ファイル全体の読み取りが終了すると、これらの関数はすべて呼び出し元に返されるため、うまく機能するとは思いません。ファイルには技術的に無限の行数がある可能性があるため、これも混乱する可能性があります(これらすべての呼び出しでメモリが不足します)。ここで私が言いたいのは、基本的には再帰関数の巨大なループです (A が B を呼び出し、B が A を呼び出し、その後 A が B を再度呼び出すという、私が説明できる限りのことです。
私はこの投稿を見つけました:デリゲートの使用に関する提案を含む Windows アプリケーションでウィンドウを待機しますが、C++ は匿名のデリゲートを受け入れません。これが私が望むことをするかどうかもわかりません。時間が経過すると、次のコード スニペットはどこに戻りますか? (これは C# 用であることはわかっていますが、考え方は同じはずですよね?)
Timer t = new Timer();
t.Interval = 2000;
t.Tick += delegate { Close(); t.Stop();};
t.Start();
スレッド化について考えましたが、それが私の問題をどのように解決するかわかりません。ファイル読み取りの別のインスタンスをトリガーするには、待機タイマーが必要です。これには、関数の呼び出しが含まれるため、エンドレスな関数呼び出しの心配が生じます。
私が見たこれもあります: http://msdn.microsoft.com/en-us/library/system.threading.timercallback.aspx、 TimerCallback を使用します。しかし、それはタイマーが起動するまでスレッドを中断しますよね? これは、GUI が応答しなくなることを意味します。
無反応はもちろん避けたいことですが、できることもあります。それとも、ファイル読み取り/待機ブロック全体を独自のスレッドに入れて、必要に応じて遅延させる方がよいでしょうか?
アドバイスをいただければ幸いです。