2012-04-02 6 views
0

更新:私は自分の問題を解決できました。以下のコードを使用して、XML保存後にMessageBoxを移動し、タイマーを100msから400msに変更しました。私は今、1つのボックスが表示され、神に感謝します。 List Array(ActListTask)で単一の値(ActReminded)を更新するのに短時間で済む人がいれば、それは知っておくとよいでしょう。MessageBoxを一度表示させる(タイマーの中のコード)

私はMessageBoxの表示に少し問題があります。私に迷惑をかけずにタイマーを見せてください。私は実際に私はすべてを繰り返しリマインダーを望んでいないだろうと私はそれが示されているか否か、リマインダーの状態に保持することをお勧めしますことを決めた

public class ActiveTasks 
    { 
     //Properties here 
    } 

public List<ActiveTasks> ActTaskList = new List<ActiveTasks>(); 

for (int i = 0; i < ListActive.Items.Count; i++) 
     { 
      if (DTime.Date == newDateTime.Date) 
      { 
       if (newDateTimeLeft.CompareTo(TimeSpan.Zero) <= 0 && ActTaskList[i].ActReminded != "true") 
       { 
        MessageBox.Show("!!!!"); 
        ActTaskList.Add(new ActiveTasks() 
        { 
         ActTitle = ActTaskList[i].ActTitle, 
         ActDesc = ActTaskList[i].ActDesc, 
         ActDate = ActTaskList[i].ActDate, 
         ActTime = ActTaskList[i].ActTime, 
         ActStatus = ActTaskList[i].ActStatus, 
         ActReminded = "true", 
         ActRepeat = ActTaskList[i].ActRepeat 
        }); 

        ListActive.Items.RemoveAt(i); 

        ActTaskList.RemoveAt(i); 

        XDocument XmlActTasks = GenerateActiveListToXML(ActTaskList); 
       } 
      } 
     } 

:ここに私が取り組んできたコードの一部ですプログラムが開かれる時間。私はActTaskListの個々の部分を更新する方法を知らないので、私はただそれを再追加してから元のものを削除しました。このコードは、発生した場合には、リマインダーのステータスをfalseからtrueに変更することを認識します。私はOk'edすべてのスパムをした後。だから私はすべてのメッセージボックスを閉じて管理した後、MessageBoxを停止します。ただし、スパムを止めるわけではありません。タイマーを100msに設定したという事実とは関係がありますか?あるいは、彼らはタイマーの中にいなくてもメッセージボックスを表示させる別の方法かもしれませんか?

+0

ここで、タイマーを宣言するコードはありますか?どのタイプのタイマーを使用していますか? –

+3

'bool'を持っています。ユーザーが表示されたときに' bool'をfalseに設定し、 'bool'がtrueのときにのみ警告を出します。 – Matthew

+1

**何を達成しようとしていますか?**その音から、一定の遅延の後に1つのメッセージボックスが必要です。それはあなたが欲しいものですか? – Ryan

答えて

0

このようなことはできますか?

Action message =() => MessageBox.Show("!!!!!!!!!!!!!")); 
object lockOb = new object(); 

void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock(lockOb) 
     if(null != message) 
     { 
      message(); 
      message = null; 
     } 
} 
+0

これは、メッセージボックスを私に迷惑にさせるだけです。 – MattVon

+0

ロックを編集して追加しました。本当にあなたの問題です。「OK」ボタンが戻るのを待っているため、nullに設定されることはありません。しかし、ロックでは、ロックが解除されるまで、メッセージを再度チェックすることはしません。 –

+0

このアップデートでは修正されません。私に秒を与える、私は私の元の質問を更新します。 – MattVon

1

現在の時刻が正確に2番目に並んでいる確率は、ループ内では小さいです。 newDateTimeをカットオフポイントとして扱い、フラグを設定するのはなぜですか?

//Declare this outside of the loop 
bool hasDisplayed = false; 

//Inside the timer event handler 
if (!hasDisplayed && DateTime.Now >= newDateTime) 
{ 
    hasDisplayed = true; 

    MessageBox.Show("!!!!!!!!!!!!!"); 
} 
0

あなたはすでに、すでにそれは以下やったようなコードは、おそらく見えたので、私は仮定している、示されてきたメッセージを示すブール値を試してみたと言います。

void TimerLoop() 
{ 
    bool msgAlreadyShown; 

    if(!msgAlreadyShown) 
    { 
     MessageBox.Show("!!!!!!!"); 
    } 
    // Other work in your timer function 
} 

このコードの問題は、関数がタイマーによって呼び出されるたびにboolがfalseに設定されることです。あなたは多くのコードを投稿していませんが、あなたが達成しようとしていることを少なくとも明言しています。タイマーは、リマインダをユーザに提示するかどうかをチェックします。

私はあなたのソフトウェアをどのようにまとめたかについていくつかの野生の推測をしていますが、それは途方もない可能性がありますが、正しい方向に向けることを願っています。あなたはこのようにリマインダークラスのいくつかの並べ替えを持っている可能性があり:

public class Reminder 
{ 
    string Message { get; set;} 
    DateTime Alarm { get; set; } 
    bool IsDismissed { get; set; } 
} 

私はあなたのタイマーループにするためにチェックすることができ、複数のリマインダを持っている場合がありますと仮定していますので、あなたのタイマーループは、のようになります:

リマインダーを永久に保持したくない場合があり、リマインダーは決して_activeRemindersリストから削除されませんが、基本的には何らかの状態を追加してリマインダーが既に表示されている場合

もちろん、これは完全な例ではありません。_activeRemindersフィールドを新たに作成したり、何かを追加したりすることはありませんが、これはあなたが何をする必要があるかというアイデアを得るのに役立ちます。また、複数のリマインダーについて気にする必要はなく、タイマーコードはこのようには見えません。主なアイデアは、リマインダの状態をどのように追跡し、それを自分のコードに合わせるかを示すことでした。上記は単なる例であった。

また、私は実際にそれをテストしていないので、他のものより擬似コードのように扱います。ただし、ロジックは健全で、メッセージボックスを一度表示させるだけでよいはずです。

+0

これは少し役に立ちました。私は既にいくつかのリストを持っているので、クラスの中に別のパブリック・ストリングを追加しました(私はあまりにもXMLからブールを読み込む方法を理解するのが面倒です)。しかし、それはMessageboxのスパミングを止めるものではありません。 – MattVon

+0

@MattVon - あなたの問題は他の場所にあるかもしれません。あるいは、上記のコードをそのまま翻訳して、アプリケーションで作業することはできません。私はちょうど上記のコードをテストし、それは私を迷惑されません。 '_activeReminders'でロックを解除した場合、スレッドがブロックする可能性があるので、コードが' MessageBox.Show() 'を実行している間にタイマーを再度実行する可能性があります。その場合、メッセージボックスを表示する前に 'IsDismissed'をtrue *に設定する必要があります。過去に、あなたのコードを実際に見ていなくても、私が多くを助けることができるかどうかはわかりません。 –

+0

質問が更新されました。うまくいけば助けになるかもしれません。 – MattVon

関連する問題