- PR -

スレッドについて

投稿者投稿内容
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-19 16:54
言語:Visual Stdio2008 C#
プロジェクト形態:Windowsサービス

1つのスレッドで、複数(5種類)のメソッドに優先順位をつけて同期処理したいの
ですがどのようなスレッドの作りにしたらいいでしょうか?
スレッドについてのアドバイスをご教授下さい。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-11-19 18:51
引用:
1つのスレッドで、複数(5種類)のメソッドに優先順位をつけて同期処理したい


よくわかりません。 スレッドが1つなら、複数のメソッドは順次処理されますよ? メソッド1つにつき、スレッド1つの意味でしょうか?

追記

で、あなたは独力で、どこまでできるのでしょう?スレッドを5つ立ち上げて、別々のメソッドを実行させ(望む処理でなくて可)、リソースの回収まで出来ますか?
それとも、そこから尋ねていますか?

前者なら、何をもって同期させるのでしょう?

[ メッセージ編集済み 編集者: Jitta 編集日時 2008-11-19 18:59 ]
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-19 19:39
ありがとうございます。
説明不足ですみません。

30秒周期でシングルスレッドで処理する場合
public class TESTクラス

Aメソッド
Aメソッドが終了したらBへ

Bメソッド
Aメソッドが終了したらBへ

Cメソッド
Aメソッドが終了したらBへ

Dメソッド
Dメソッドが終了したら次の30秒まで待機

のような同期処理を実現したいのですが
可能でしょうか?
参照URLがあったら教えてください。


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-11-19 20:15
引用:

しんさんの書き込み (2008-11-19 19:39) より:

Aメソッド
Aメソッドが終了したらBへ

Bメソッド
Aメソッドが終了したらBへ

Cメソッド
Aメソッドが終了したらBへ

Dメソッド
Dメソッドが終了したら次の30秒まで待機

のような同期処理を実現したいのですが可能でしょうか?


矢印と書いてあることが一致していないように思いますが... 矢印を信じた場合、優先順位は必要なくて 1 スレッドで逐次実行し D メソッド後に 30 秒待機させれば良いように思いますが...

私が意図を読み取れていないだけかもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-19 23:22
「Bスレッドで、Aスレッドが終了したらBへ」っていうのも
「Cスレッドで、Aスレッドが終了したらBへ」っていうのも
理解できません。

考えがまとまっていない状態で質問するのは、如何なものか
と思います。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-11-20 09:21
全体的に意味不明な質問ですが、無理矢理、超好意的に解釈してみます。

引用:

逐次実行し D メソッド後に 30 秒待機させれば良いように思いますが...


A〜Dの実行にある程度時間がかかる場合、Dメソッドの完了後に30秒待機させると実行周期がずれていきますね。「次の30秒まで待機」という表現からもA〜Dの実行にかかった時間は差し引かなければならないような印象を受けました。つまり、正確に30秒周期で A を開始したい?

このようなことを実現しようとした場合には(実際の処理部はシングルスレッドで十分だったとしても)別のスレッドを使うのは有効ですね。たとえば、JavaではScheduledExecutorService.scheduleAtFixedRate()で実現できます。scheduleWithFixedDelay()を使うとDの完了後に指定時間待機することになります。scheduleWithFixedDelay()はDのあとでsleepさせるのとほとんど同じです。

.NETでもTimerを使えばscheduleAtFixedRate()と同様に周期を維持した実行ができるのではないかと思います。System.Windows.Forms.Timerはイベントディスパッチスレッドを使用するし、System.Timers.Timerも別のスレッドを使用しますよね。

なので、順次実行だからといって、スレッドが必要ないとは言えないですね。

#「Bスレッドで、Aスレッドが終了したらBへ」などの表現はコピペ時のミスと好意的に捉えておきます。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-11-20 10:15
雰囲気のみで解釈すると

コード:
/// <summary>
/// 5種類のメソッドを順番に実行する関数。
/// </summary>
private void Fメソッド()
{
    Aメソッド();
    Bメソッド();
    Cメソッド();
    Dメソッド();
    Eメソッド();
}



っていう関数を Timer で 30 秒毎に呼び出すだけでいいんじゃ、
と思いますが・・・。
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-20 10:37
言語:Visual Stdio2008 C#

本当にすみませんでした。
たくさん回答ありがとうございます。
よく確認しないで送信したことをお詫びします。
以後、気をつけます。

下記の流れでシングルスレッド方式を使って
処理させようと考えているのですが、
各メソッドが終了したかをJOIN()を使って処理させようとしています。
但し、あるメソッドが終了しない状態になった場合、
各メソッドをタイムアウトで終了させようと考えていますのですが
以下のスレッド処理について、何か理想的な方法がありましたら
ご教授ください。


30秒周期でA〜Dのメソッドを順に実行(System.Timers使用)
Aメソッド
A.JOIN() //Aメソッド終了後Bメソッドへ

Bメソッド
B.JOIN() /Bメソッド終了後Cメソッドへ

Cメソッド
C.JOIN() //Cメソッド終了後Dメソッドへ

Dメソッド
D.JOIN() //Dメソッド終了後、次の30秒でAメソッドへ

スキルアップ/キャリアアップ(JOB@IT)