C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 処理の終了を待ちたい


(過去ログ 61 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■35469 / inTopicNo.1)  処理の終了を待ちたい
  
□投稿者/ マキナ (1回)-(2009/05/02(Sat) 00:33:10)

分類:[C#] 

ファイルの存在を確認して、存在する場合に処理をしたいと思います。
ファイルが存在したらすぐに処理をしたいので、監視時間を短くしたいのですが、
短くすると、処理には時間がかかるため、くり返し処理してしまいます。
処理の終了を待ちたいのですが、どのようにしたらよいでしょう?

using System;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool there = false;
        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 200;
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (File.Exists(@"C:\tmp.txt")) 
            {
                there = true;
                if (there == true)
                {
                    MessageBox.Show("there");
                    System.Threading.Thread.Sleep(10000);
                    there = false;
                }
            }
            
        }
    }
}

boolで処理するかどうかを判定し、処理終了後にfalseにしているつもりなのですが、
これだと、つぎつぎとメッセージボックスが開いてしまいます。
アドバイス乞う。

引用返信 編集キー/
■35470 / inTopicNo.2)  Re[1]: 処理の終了を待ちたい
□投稿者/ ぽぴ王子 (434回)-(2009/05/02(Sat) 01:35:49)
ぽぴ王子 さんの Web サイト
No35469 (マキナ さん) に返信

>                 there = true;
>                 if (there == true)

there を true にした、その直後に there が true だったならという処理が入ってますよね。
そうなると必ずその処理を通ることになるので、タイマーが動作するたびにメッセージボックス
を表示することになりませんか?

> ファイルが存在したらすぐに処理をしたいので、監視時間を短くしたいのですが、
> 短くすると、処理には時間がかかるため、くり返し処理してしまいます。
> 処理の終了を待ちたいのですが、どのようにしたらよいでしょう?

Thread.Sleep(10000) が時間がかかる処理のイメージでしょうか。
その場合、Sleep している間処理が止まってしまうので、終わってからタイマー処理が起動して…
となってしまいそうです。

この場合はファイルが存在するチェック、あるいは逆に時間がかかる処理を別スレッドでやって
しまうのがいいかもしれません。

引用返信 編集キー/
■35471 / inTopicNo.3)  Re[1]: 処理の終了を待ちたい
□投稿者/ オショウ (169回)-(2009/05/02(Sat) 01:47:39)
No35469 (マキナ さん) に返信
> ファイルの存在を確認して、存在する場合に処理をしたいと思います。
> ファイルが存在したらすぐに処理をしたいので、監視時間を短くしたいのですが、
> 短くすると、処理には時間がかかるため、くり返し処理してしまいます。
> 処理の終了を待ちたいのですが、どのようにしたらよいでしょう?

  存在したら・・・と言うのは、元々無かったところに
  新しく造られたら?と言うことでしょうか?

  であれば、FileSystemWatcherクラスでファイル監視を行えば
  生成されたタイミングで処理を始めれます。

  (当然、変更や削除もイベントとして取れますが)

  調べてみて下さい。

以上。
引用返信 編集キー/
■35473 / inTopicNo.4)  Re[2]: 処理の終了を待ちたい
□投稿者/ マキナ (2回)-(2009/05/02(Sat) 02:28:03)
ありがとうございます。
まず、自己解決しました。
なんのことはない。タイマーをとめればいいので、
            if (File.Exists(@"C:\tmp.txt")) {
                timer1.Enabled = false;
                MessageBox.Show("there");
                System.Threading.Thread.Sleep(10000);
                timer1.Enabled = true;
            }
でできそうです。

おっしゃるように、もともとなかったところに新しく作られることを監視しようとしています。
FileSystemWatcherクラスを調べてみます。
ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -