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

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

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

Re[7]: TPLを利用した計算順次処理について


(過去ログ 101 を表示中)

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

■60310 / inTopicNo.1)  TPLを利用した計算順次処理について
  
□投稿者/ KQ (1回)-(2011/06/27(Mon) 15:52:49)

分類:[C#] 

VS2010・C#・.NET 4.0でWindowsアプリケーションを作成しています。

マルチコア並列処理(TPL)を想定しており、
Task、Parallelを利用すれば…と思うのですが、
.NET2.0までの知識しかないため、実装方法に悩んでいます。

・重い計算を行うバッチが複数ある
・同時に行う計算の数を指定しておく
 ↓
「実行」ボタンクリックなどで、指定数のバッチを同時に起動して、
1つの計算が終了したら、未実行の計算バッチを順次起動する

(例)
計算A、B、C、D、Eがあり、同時に3計算実行するとして、
「実行」するとA・B・Cが起動し、どれかひとつ計算が終了したら、
Dを起動、さらにどれかひとつ計算が終了したらEを起動する。


何かヒントをいただければ…!
宜しくお願いいたします。
引用返信 編集キー/
■60311 / inTopicNo.2)  Re[1]: TPLを利用した計算順次処理について
□投稿者/ 無明 (2回)-(2011/06/27(Mon) 16:09:34)
⇒ ttp://code.msdn.microsoft.com/10-TPL-C-b44788f1
引用返信 編集キー/
■60314 / inTopicNo.3)  Re[1]: TPLを利用した計算順次処理について
□投稿者/ shu (811回)-(2011/06/27(Mon) 16:52:39)
No60310 (KQ さん) に返信

各処理の区別をするためのクラス(実際にはなくてもよい)
public class NumAction
{
	public int No;
	public Action Act;
}


private void button1_Click(object sender, EventArgs e)
{
行う処理を10ほど追加(実際の処理をここでQueueに追加)
	Queue<NumAction> TaskQue = new Queue<NumAction>();
	for (int i = 0; i < 10; i++) {
		TaskQue.Enqueue(new NumAction {No =i,Act = () => {
			System.Threading.Thread.Sleep(500);
		}});
	}
並列処理部の処理
	List<Action> ActList = new List<Action>();
	Action act = () =>
	{
		NumAction Tsk;
		do
		{
			lock (TaskQue)
			{
				Tsk = null;
				if (TaskQue.Count > 0)
				{
					Tsk = TaskQue.Dequeue();
				}
			}
			if (Tsk != null)
			{
				Console.WriteLine("Begin:" + Tsk.No);
				Tsk.Act();
				Console.WriteLine("End:" + Tsk.No);
		}
		} while (Tsk != null);
	};
3つ並列なので3つ追加
	ActList.Add(act);
	ActList.Add(act);
	ActList.Add(act);
並列実行
	Parallel.ForEach(ActList,  act2 => act2());
}

引用返信 編集キー/
■60320 / inTopicNo.4)  Re[2]: TPLを利用した計算順次処理について
□投稿者/ επιστημη (2645回)-(2011/06/27(Mon) 21:36:04)
επιστημη さんの Web サイト
コード・サンプルとしてはこいつ↓が好適かも。
http://msdn.microsoft.com/ja-jp/library/ee789351.aspx

引用返信 編集キー/
■60514 / inTopicNo.5)  Re[3]: TPLを利用した計算順次処理について
□投稿者/ KQ (2回)-(2011/07/06(Wed) 13:41:54)
> επιστημηさん
ご紹介ありがとうございます。

shuさんのサンプルコードを参照させていただきました。

ただ、このままですと、
「3つ並列」で起動した後、計算処理が終了する前に、
次々と残りの計算を実行しはじめてしまいます。

計算処理終了後に、次の計算を起動するようなやり方は、
どうすれば良いでしょうか?
(勉強不測ですみません…
Actionなど初めて接する用語が多いので、難しいです…;;)
引用返信 編集キー/
■60515 / inTopicNo.6)  Re[4]: TPLを利用した計算順次処理について
□投稿者/ shu (832回)-(2011/07/06(Wed) 13:53:54)
No60514 (KQ さん) に返信

> 「3つ並列」で起動した後、計算処理が終了する前に、
> 次々と残りの計算を実行しはじめてしまいます。
各計算処理が別スレッドで動くような作りになっていませんか?
各計算処理はスレッド起動をしないで動作する作りにしておいて下さい。
スレッドセーフな作りにはしておいて下さい。
引用返信 編集キー/
■60516 / inTopicNo.7)  Re[5]: TPLを利用した計算順次処理について
□投稿者/ KQ (3回)-(2011/07/06(Wed) 14:27:28)
No60515 (shu さん) に返信
> ■No60514 (KQ さん) に返信
> 
>>「3つ並列」で起動した後、計算処理が終了する前に、
>>次々と残りの計算を実行しはじめてしまいます。
> 各計算処理が別スレッドで動くような作りになっていませんか?
> 各計算処理はスレッド起動をしないで動作する作りにしておいて下さい。
> スレッドセーフな作りにはしておいて下さい。

実行用のクラスは、以下のようにしました。
public class NumAction
{
	public int No;
        public Action Act;
        public long CalcNum; // 計算exeに渡す数値
}

実行コードの中で、
----------------------------------------------
Queue<NumAction> TaskQue = new Queue<NumAction>();

// 計算数(作成した計算リストの数)
int total = CalcList.CalcDataList.Count;

// 行う処理を追加
for (int i = 0; i < total; i++)
{
	int idx = i;
        TaskQue.Enqueue(new NumAction
        {
           No = i,
           Act = () =>
           {
	      // プロセス起動
              StartProcess(idx);
           }
         }
         );
         }
......
----------------------------------------------
private void StartProcess(int idx)
{        
	// 渡す数値
        long num = CalcList.CalcDataList[idx].Num;

        Process process = new Process();
        process.StartInfo.FileName = ExeFileName;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        process.StartInfo.WorkingDirectory = Path.GetDirectoryName(exePath);
        process.StartInfo.Arguments = string.Format("{0}", num);

        process.Start();
}
で、Processのインスタンスを作成して、計算exeを起動しています。

Processのインスタンスで起動するのは、スレッドセーフではないのかも…??

引用返信 編集キー/
■60517 / inTopicNo.8)  Re[6]: TPLを利用した計算順次処理について
□投稿者/ shu (833回)-(2011/07/06(Wed) 14:33:03)
No60516 (KQ さん) に返信

> process.Start();
この後にprocess.WaitForExit();
がないとそのまま流れてしまいます。


> }
> で、Processのインスタンスを作成して、計算exeを起動しています。
>
> Processのインスタンスで起動するのは、スレッドセーフではないのかも…??
多分大丈夫だと思う。

引用返信 編集キー/
■60588 / inTopicNo.9)  Re[7]: TPLを利用した計算順次処理について
□投稿者/ KQ (4回)-(2011/07/11(Mon) 14:59:39)
No60517 (shu さん) に返信
> ■No60516 (KQ さん) に返信
>
>> process.Start();
> この後にprocess.WaitForExit();
> がないとそのまま流れてしまいます。

process.WaitForExit();
を入れました。
仰るとおり、指定した処理数を保って次々に計算実行することができました。

ありがとうございました!!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -