4

ShowDialog 関数を使用してフォームを起動するマネージャー クラスがあります。現在、イベント (タイマーなど) を開始しており、タイマーが期限切れになるまでマネージャーにフォームを閉じてもらいたいと考えています。

私は2つのクラスを使用しました:

namespace ConsoleApplication3
{
class Manager
{
    Timer UpdTimer = null;
    readonly int REFRESH_STATUS_TIME_INTERVAL = 5000;
    Form1 form1;

    public Manager()
    {
    }

    public void ManageTheForms()
    {
        UpdTimer = new Timer(REFRESH_STATUS_TIME_INTERVAL);
        // start updating timer
        //UpdTimer.Interval = REFRESH_STATUS_TIME_INTERVAL;
        UpdTimer.Elapsed += new ElapsedEventHandler(PriorityUpdTimer_Elapsed);
        UpdTimer.Start();

        form1 = new Form1();
        form1.ShowDialog();


    }

    public void PriorityUpdTimer_Elapsed(object source, ElapsedEventArgs e)
    {
        UpdTimer = null;
        form1.closeFormFromAnotherThread();

    }
}
}

Form1 クラス:

namespace ConsoleApplication3
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {

    }


    delegate void CloseFormFromAnotherThread();

    public void closeFormFromAnotherThread()
    {
        if (this.InvokeRequired)
        {
            CloseFormFromAnotherThread del = new CloseFormFromAnotherThread(closeFormFromAnotherThread);
            this.Invoke(del, new object[] { });
        }
        else
        {
            this.Close();
        }
    }

}

}

4

1 に答える 1

1

私が正しければ、タイマーが停止したときにフォームを閉じたいと思います。

これは私がそれをする方法です:

System.Threading.Timer formTimer;

ブール値を使用して、タイマーがまだアクティブかどうかを確認します

public Boolean active { get; set; }

この関数を作成します。

public void timerControl()
{
  if (!active) formTimer = new System.Threading.Timer(new TimerCallback(TimerProc));
  try
  {
    formTimer.Change(REFRESH_STATUS_TIME_INTERVAL, 0);
  }
  catch {}
  active = true;
}

タイマーを完了するには、新しいタイマーが作成されたときに呼び出される関数TimerProcが必要です。

private void TimerProc(object state)
{
  System.Threading.Timer t = (System.Threading.Timer)state;
  t.Dispose();
  try
  {
    CloseScreen();
  }
  catch{}
}

プログラムを簡単にするために、関数CloseScreen()を作成しました。

public void CloseScreen()
{
  if (InvokeRequired)
  {
    this.Invoke(new Action(CloseScreen), new object[] { });
    return;
  }
  active = false;
  Close();
}

これらすべての関数をフォームクラスに配置し、timerControlを使用してタイマーをアクティブにします。Managerクラスからアクセスすることを選択できます。Form1.TimerControl();または、イベントハンドラーに入れて成功します。

于 2013-01-11T15:20:05.853 に答える