1

次のコードがあります。

namespace SSS.RemoteTruckService
{
  public partial class Startup : Form
  {
    private Timer _gpsTimer;
    private Timer _ppsTimer;
    private Timer _creditCardTimer;
    private Timer _iniTimer;

    public string Message
    {
      get { return richTextBox_Message.Text; }
      set
      {
        richTextBox_Message.Invoke((MethodInvoker)(() 
          => richTextBox_Message.Text = DateTime.Now + " " + 
          value + Environment.NewLine + richTextBox_Message.Text));
      }
    }

    public Startup()
    {
      InitializeComponent();
    }

    private void ButtonStartClick(object sender, EventArgs e)
    {
      StartRemoteTruck();
    }

    private void ButtonPauseClick(object sender, EventArgs e)
    {
      if (_gpsTimer.Enabled) _gpsTimer.Enabled = false;
      if (_ppsTimer.Enabled) _ppsTimer.Enabled = false;
      if (_creditCardTimer.Enabled) _creditCardTimer.Enabled = false;
      if (_iniTimer.Enabled) _iniTimer.Enabled = false;
      ProcessIniFile.StopProcess();
    }

    public void StartRemoteTruck()
    {
      Message = "RemoteTruck started.";

      if (Settings.GlobalSettings == null)
      {
        Message = "GlobalSettings was null or not loaded. Cannot continue.";
        Logging.Log("GlobalSettings was null or not loaded. Cannot continue.", "RemoteTruck", Apps.RemoteTruckService);
        Environment.Exit(0);
      }

      if (Settings.GlobalSettings.IniFileWatcherEnabled)
      {
        ProcessIniFile.StartProcess();        
      }

      CreateTimers();      
    }

そして、ProcessIniFile.StartProcess()私はコードを持っています:

namespace SSS.RemoteTruckService.inifile
{
  public static class ProcessIniFile
  {
    private static DateTime _iniLastWriteTime;
    private static readonly string Inifile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sss.ini");
    private static FileSystemWatcher _watcher;

    public static void StartProcess()
    {  
      ReadIniFile();
      SaveCurrentIniReadings();
      CreateIniFileWatcher();
    }

    public static void StopProcess()
    {
      if (_watcher != null)
      {
        _watcher.EnableRaisingEvents = false;
        _watcher = null;
      }
    }

    private static void CreateIniFileWatcher()
    {
       _watcher = new FileSystemWatcher
        {
          Path = Environment.GetFolderPath(Environment.SpecialFolder.Windows),
          NotifyFilter = NotifyFilters.LastWrite,
          Filter = "sss.ini"
        };
      _watcher.Changed += SssIniWatcherChanged;
      _watcher.EnableRaisingEvents = true;
    }

ファイルウォッチャーの読み取りステータスを呼び出しフォームに返したいと思います。

Message考えすぎかもしれませんが、メイン フォームにを追加したい場合は、どうすればよいですか?

4

2 に答える 2

0

そのためにイベントを使用できます。プロセスはイベントを送信でき、フォームはそれらを処理できます。詳細: http://msdn.microsoft.com/en-us/library/awbftdfh.aspx

于 2013-07-02T22:34:01.013 に答える
0

フォームのその部分も静的にするのは、単純ですがあまりよくない方法です。たとえば、静的変数を作成WriteMessageし、フォーム ロードまたはStartup()で設定できます。

WriteMessage = (s) => Message = s;

確かにこれにはいくつかの問題がありますが、それを実行するための迅速な方法です。これらの問題の 1 つはDispatcher.invoke、UI スレッドを使用していない場合に使用する必要がある場合があることです。

于 2013-07-03T03:02:23.960 に答える