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

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

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

Re[4]: 一定間隔で処理を繰り返す


(過去ログ 71 を表示中)

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

■41422 / inTopicNo.1)  一定間隔で処理を繰り返す
  
□投稿者/ ヒカリ (8回)-(2009/09/19(Sat) 17:09:48)

分類:[C#] 

アプリ起動→処理→待機(5分)→処理→待機……(以後終了するまで繰り返し)

というように、処理をしたいのですが、やり方が分かりません。

引用返信 編集キー/
■41423 / inTopicNo.2)  Re[1]: 一定間隔で処理を繰り返す
□投稿者/ sara (2回)-(2009/09/19(Sat) 17:16:33)
No41422 (ヒカリ さん) に返信
> アプリ起動→処理→待機(5分)→処理→待機……(以後終了するまで繰り返し)
>
> というように、処理をしたいのですが、やり方が分かりません。
>
ASP.NET AJAXのTimerControlで実現できるのではないでしょうか?
http://www.microsoft.com/japan/seminar/msdn/webcast/bg/48.ajax.timecontrol/play.aspx
引用返信 編集キー/
■41426 / inTopicNo.3)  Re[2]: 一定間隔で処理を繰り返す
□投稿者/ 渋木宏明(ひどり) (1211回)-(2009/09/19(Sat) 18:14:56)
渋木宏明(ひどり) さんの Web サイト
あなたのいう「アプリ」は

・ASP.NET アプリケーション
・Windows.Forms アプリケーション

のいずれかですか? あるいはまた別なものですか?
引用返信 編集キー/
■41429 / inTopicNo.4)  Re[3]: 一定間隔で処理を繰り返す
□投稿者/ やじゅ (1331回)-(2009/09/19(Sat) 18:58:19)
やじゅ さんの Web サイト
2009/09/19(Sat) 20:17:09 編集(投稿者)
2009/09/19(Sat) 19:00:22 編集(投稿者)

記事検索「ヒカリ」で見たところでは、Windowsアプリケーションですね。

待機ならSleep(5 * 60 * 1000)とかする。
http://dobon.net/vb/dotnet/process/sleep.html
引用返信 編集キー/
■41432 / inTopicNo.5)  Re[4]: 一定間隔で処理を繰り返す
□投稿者/ なちゃ (326回)-(2009/09/19(Sat) 19:13:47)
Windowsアプリケーションなら普通それはまずいと思いますが…

引用返信 編集キー/
■41440 / inTopicNo.6)  Re[1]: 一定間隔で処理を繰り返す
□投稿者/ 魔界の仮面弁士 (1306回)-(2009/09/19(Sat) 19:48:15)
2009/09/19(Sat) 19:58:46 編集(投稿者)
No41422 (ヒカリ さん) に返信
> アプリ起動→処理→待機(5分)→処理→待機……(以後終了するまで繰り返し)
> というように、処理をしたいのですが、やり方が分かりません。

処理内容にもよりますが:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bgw = (BackgroundWorker)sender;
    int 処理残数;
    while (( 処理残数 = 何かの処理() ) > 0)
    {
        if(bgw.WorkerReportsProgress) bgw.ReportProgress(0, 処理残数);
        System.Threading.Thread.Sleep(5 * 60 * 1000);  // 5分待機
    }
    if (bgw.WorkerReportsProgress) bgw.ReportProgress(100, 0);
}

引用返信 編集キー/
■41442 / inTopicNo.7)  Re[5]: 一定間隔で処理を繰り返す
□投稿者/ やじゅ (1332回)-(2009/09/19(Sat) 20:27:18)
やじゅ さんの Web サイト
No41432 (なちゃ さん) に返信
> Windowsアプリケーションなら普通それはまずいと思いますが…

そうですね単純回答でした、すみません。

魔界の仮面弁士さんが別のスレッド案をされているので、それは良しとして。

なぜ、ダメなのかということで↓もリンクしておきます。
時間がかかる処理での「応答なし」を回避するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html
引用返信 編集キー/
■41454 / inTopicNo.8)  Re[2]: 一定間隔で処理を繰り返す
□投稿者/ ヒカリ (9回)-(2009/09/19(Sat) 21:50:12)
No41440 (魔界の仮面弁士 さん) に返信
> 2009/09/19(Sat) 19:58:46 編集(投稿者)
>
> ■No41422 (ヒカリ さん) に返信
>>アプリ起動→処理→待機(5分)→処理→待機……(以後終了するまで繰り返し)
>>というように、処理をしたいのですが、やり方が分かりません。
>
> 処理内容にもよりますが:
>
> private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
> {
> BackgroundWorker bgw = (BackgroundWorker)sender;
> int 処理残数;
> while (( 処理残数 = 何かの処理() ) > 0)
> {
> if(bgw.WorkerReportsProgress) bgw.ReportProgress(0, 処理残数);
> System.Threading.Thread.Sleep(5 * 60 * 1000); // 5分待機
> }
> if (bgw.WorkerReportsProgress) bgw.ReportProgress(100, 0);
> }

ソースを書いてくださってありがとうございます。
処理はメモ帳(windows標準)を起動させたいのですが、できるでしょうか?
System.Diagnostics.Process.Start(@"C:\WINDOWS\system32\notepad.exe");
(環境:XP)
引用返信 編集キー/
■41456 / inTopicNo.9)  Re[3]: 一定間隔で処理を繰り返す
□投稿者/ Azulean (458回)-(2009/09/19(Sat) 21:54:35)
No41454 (ヒカリ さん) に返信
> ソースを書いてくださってありがとうございます。
> 処理はメモ帳(windows標準)を起動させたいのですが、できるでしょうか?
> System.Diagnostics.Process.Start(@"C:\WINDOWS\system32\notepad.exe");
> (環境:XP)
試しませんか?

試してできたけど不安があるのであれば、それを聞いて下さい。
試してできなかったのであれば、エラーや例外等、発生した現象を元に聞いて下さい。

# Windows フォルダが C:\ にあるという仮定は本当に問題ないのかという点も気にしましょう。
引用返信 編集キー/
■41457 / inTopicNo.10)  Re[3]: 一定間隔で処理を繰り返す
□投稿者/ 何で? (1回)-(2009/09/19(Sat) 21:57:45)
No41454 (ヒカリ さん) に返信
> ソースを書いてくださってありがとうございます。
> 処理はメモ帳(windows標準)を起動させたいのですが、できるでしょうか?
できる?かどうか?すぐ確認できるじゃない。なぜすぐ聞く?確認しようとしない?

> System.Diagnostics.Process.Start(@"C:\WINDOWS\system32\notepad.exe");
> (環境:XP)
引用返信 編集キー/
■41458 / inTopicNo.11)  Re[3]: 一定間隔で処理を繰り返す
□投稿者/ 魔界の仮面弁士 (1307回)-(2009/09/19(Sat) 22:07:26)
2009/09/19(Sat) 22:15:49 編集(投稿者)
No41454 (ヒカリ さん) に返信
> 処理はメモ帳(windows標準)を起動させたいのですが、できるでしょうか?
> System.Diagnostics.Process.Start(@"C:\WINDOWS\system32\notepad.exe");

つまり、5 分ごとに空のメモ帳が起動するという事ですね。

そうすると…PC の前から数時間ほど離籍してから戻ってみると、
画面上に数十個ものメモ帳が起動された状態になっているわけですが、問題ありませんか?
(それとも以前のメモ帳が閉じられるまでは、次の 5 分後の起動は行わないのでしょうか?)


using System;
using System.Windows.Forms;
using System.Diagnostics;

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

        private Stopwatch watch = null;
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (watch == null || watch.Elapsed.TotalMinutes >= 5)
            {
                Process.Start("notepad.exe");
                watch = Stopwatch.StartNew();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            timer1.Stop();
        }
    }
}

引用返信 編集キー/
■41485 / inTopicNo.12)  Re[2]: 一定間隔で処理を繰り返す
□投稿者/ せつな (1回)-(2009/09/20(Sun) 18:34:52)
処理途中での中断や終了を考えると、魔界の仮面弁士さんの意見と同じく、別スレッドで処理するべきかと考えます。

そこで、疑問というか、ちょっと質問なんですが、昔、別スレッドで処理させる際に「TimerCallbackデリゲート」を
使ったことがありますが、今は「スレッド セーフな呼び出し」としては「BackgroundWorker」を使った方がよいのでしょうか?


引用返信 編集キー/
■41501 / inTopicNo.13)  Re[3]: 一定間隔で処理を繰り返す
□投稿者/ れい (855回)-(2009/09/21(Mon) 07:35:03)
No41485 (せつな さん) に返信
> 処理途中での中断や終了を考えると、魔界の仮面弁士さんの意見と同じく、別スレッドで処理するべきかと考えます。

どのような「処理途中での中断や終了」か、にも依りますが、
「処理途中での中断や終了」があり、「待機」があるならむしろシングルスレッドの方がパフォーマンスもよく、且つ作りやすいでしょう。
魔界の仮面弁士さんも2案目はシングルスレッドです。

> そこで、疑問というか、ちょっと質問なんですが、昔、別スレッドで処理させる際に「TimerCallbackデリゲート」を
> 使ったことがありますが、今は「スレッド セーフな呼び出し」としては「BackgroundWorker」を使った方がよいのでしょうか?

「スレッドセーフな呼び出し」の意味を間違っているかと。
「スレッドセーフな呼び出し」は「多数のスレッドから呼び出しても安全な呼び出し」です。
BackGroundWorkerクラスのメソッドはstaticなものを除いてスレッドセーフを保証していません。
特に、BackGroundWorker.RunWorkerAsyncはスレッドセーフではありません。
(たぶんIsBusyはスレッドセーフです。)

「別スレッドで処理させる方法」としては、適当に列挙すると
I. イベント
I.a BackgroundWorkerを使う
I.b 自分でXXXAsyncを実装
II. IAsyncResultを用いた手法
II.a DelegateをBeginInvokeする
II.b クラス組み込みのBeginXXX/EndXXXを用いる
III. TimerCallback
IV. ThreadPool
V. Thread.Start
などがあります。(下に行くほど何となく低階層)
当然それぞれ特徴があるので、状況に応じて使い分けるべきです。
「TimerCallbackは使わないほうがよい」という資料を見たことはありません。

引用返信 編集キー/
■41506 / inTopicNo.14)  Re[4]: 一定間隔で処理を繰り返す
□投稿者/ せつな (2回)-(2009/09/21(Mon) 23:47:03)
No41501 (れい さん) に返信
> ■No41485 (せつな さん) に返信
>>処理途中での中断や終了を考えると、魔界の仮面弁士さんの意見と同じく、別スレッドで処理するべきかと考えます。
>
> どのような「処理途中での中断や終了」か、にも依りますが、
> 「処理途中での中断や終了」があり、「待機」があるならむしろシングルスレッドの方がパフォーマンスもよく、且つ作りやすいでしょう。
> 魔界の仮面弁士さんも2案目はシングルスレッドです。
>
>>そこで、疑問というか、ちょっと質問なんですが、昔、別スレッドで処理させる際に「TimerCallbackデリゲート」を
>>使ったことがありますが、今は「スレッド セーフな呼び出し」としては「BackgroundWorker」を使った方がよいのでしょうか?
>
> 「スレッドセーフな呼び出し」の意味を間違っているかと。
> 「スレッドセーフな呼び出し」は「多数のスレッドから呼び出しても安全な呼び出し」です。
> BackGroundWorkerクラスのメソッドはstaticなものを除いてスレッドセーフを保証していません。
> 特に、BackGroundWorker.RunWorkerAsyncはスレッドセーフではありません。
> (たぶんIsBusyはスレッドセーフです。)
>
> 「別スレッドで処理させる方法」としては、適当に列挙すると
> I. イベント
> I.a BackgroundWorkerを使う
> I.b 自分でXXXAsyncを実装
> II. IAsyncResultを用いた手法
> II.a DelegateをBeginInvokeする
> II.b クラス組み込みのBeginXXX/EndXXXを用いる
> III. TimerCallback
> IV. ThreadPool
> V. Thread.Start
> などがあります。(下に行くほど何となく低階層)
> 当然それぞれ特徴があるので、状況に応じて使い分けるべきです。
> 「TimerCallbackは使わないほうがよい」という資料を見たことはありません。
>

ずれた質問をしてしまい、申し訳ございませんでした。
つい、「別スレッドからコントロールを使いたいとかやりたくなるだろうな」と勝手に先読みして
考えずに発言してしまいました。

しかしながら、回答していただきありがとうございました。
一口に「別スレッドで処理させる」といっても、いろいろあるんですね。
「BackgroundWorker」も使ったことがなかったんで、ご教示いただいた内容も併せて、いろいろ試したいと思います。
ありがとうございました。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -