- PR -

スレッドについて

投稿者投稿内容
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-11-20 11:25
Join()?
それって Thread.Join メソッドですか?
だとすると「A」ってメソッドじゃなくてスレッドのインスタンスじゃないですか?

やりたい事、知りたい事を日本語で丁寧に書いた方が良いと思います。
質問内容を見直して逆の立場だったらわかかるかな?とか。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-11-20 11:38
引用:

しんさんの書き込み (2008-11-20 10:37) より:

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



----- ここから
・タイマー(30秒間隔)を停止する

・別スレッドで、Aメソッドを実行する
・別スレッドの終了を、最大 ? 秒待機する

・別スレッドで、Bメソッドを実行する
・別スレッドの終了を、最大 ? 秒待機する

・別スレッドで、Cメソッドを実行する
・別スレッドの終了を、最大 ? 秒待機する

・別スレッドで、Dメソッドを実行する
・別スレッドの終了を、最大 ? 秒待機する

・タイマー(30秒間隔)を開始する
----- ここまで

の一連の処理を、タイマーが30秒を刻むごとに実行すればいいのでは。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-11-20 12:13
A, B, C, D いずれも実行に12秒かかるとした場合、以下のようになるってことですか?

経過秒数
0    A を開始(12秒実行して完了)
12    B を開始(12秒実行して完了)
24    C を開始(6秒実行して中止)
30    A を開始(以下繰り返し)
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-11-20 12:33
引用:

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


私は↑の記述から、Dメソッドの実行が(正常終了なりタイムアウトなり)終わってから、30秒経って再びAメソッドを実行するのだと読み取ったのですが…どっちでしょうね?

----- 追記
なるほど、「30秒周期で」とも書いているのか。そりゃわからん…。

[ メッセージ編集済み 編集者: rain 編集日時 2008-11-20 14:33 ]
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2008-11-20 14:27
よくわからないけど、こういうこと?

※コンソールプロジェクト
停止は Ctrl+C

コード:
Imports System.Text
Imports System.Threading

Module Module2

    Sub Main()
        Dim _name As String = Nothing
        Dim _priority As UInteger = 0
        Dim _argX As UInteger = 0
        Dim _thread As testThread2 = Nothing

        Dim _list As SortedList(Of UInteger, testThread2) = New SortedList(Of UInteger, testThread2)

        Do
            Console.Write("Thread Name (開始するには Enterキー)? ")
            _name = Console.ReadLine()
            If String.IsNullOrEmpty(_name) Then
                Exit Do
            End If
            Console.Write("Priority ? ")
            If Not UInteger.TryParse(Console.ReadLine(), _priority) Then
                Console.WriteLine("PriorityはUinteger型の範囲内で入力してください。")
                Continue Do
            End If
            If _list.ContainsKey(_priority) Then
                Console.WriteLine("入力されたPriorityは既に使用されています。")
                Continue Do
            End If
            Console.Write("ArgX(")
            Console.Write(UInteger.MinValue.ToString())
            Console.Write("〜")
            Console.Write(UInteger.MaxValue.ToString())
            Console.Write(") ? ")
            If Not UInteger.TryParse(Console.ReadLine(), _argX) Then
                Console.WriteLine("ArgXはUinteger型の範囲内で入力してください。")
                Continue Do
            End If
            _thread = New testThread2(_name, _priority, _argX)
            _list.Add(_thread.Priority, _thread)
        Loop

        Do
            Console.WriteLine("!!実行開始!! ")

            For Each _targetKeyValuePair As KeyValuePair(Of UInteger, testThread2) In _list
                _targetKeyValuePair.Value.Start()
                _targetKeyValuePair.Value.join()
            Next

            Console.WriteLine("!!3000_秒待機!!")
            Thread.Sleep(3000)
        Loop

    End Sub

End Module

Public Class testThread2

    Private _Name As String = Nothing
    Private _Priority As UInteger = 0
    Private _ArgX As UInteger = 0
    Private _InnerThread As Thread = Nothing
    Private _InnerTimer As Timer = Nothing
    Private _StartTime As DateTime = DateTime.MinValue

    Public Sub New(ByVal name As String, ByVal priority As UInteger, ByVal argX As UInteger)
        Me._Name = name
        Me._Priority = priority
        Me._ArgX = argX
    End Sub

    Public Sub Start()
        _StartTime = DateTime.Now
        Me._InnerThread = New Thread(New ThreadStart(AddressOf Method))
        Me._InnerThread.Start()
        Me._InnerTimer = New Timer(AddressOf SelfCheck, Nothing, 0, 25)
    End Sub

    Private Sub SelfCheck(ByVal state As Object)
        If Me._InnerTimer Is Nothing Then
            'タイマ停止済み
        ElseIf (DateTime.Now - Me._StartTime).Seconds > 1 Then
            Console.WriteLine(Me.Name & "はタイムアウトしました。")
            Me._InnerTimer.Dispose()
            Me._InnerTimer = Nothing
            Me._InnerThread.Abort()
        End If
    End Sub

    Public Sub Abort()
        If Me._InnerThread IsNot Nothing Then
            Me._InnerThread.Abort()
        End If
        If Me._InnerTimer IsNot Nothing Then
            Me._InnerTimer.Dispose()
        End If
    End Sub

    Public Sub join()
        Me._InnerThread.Join()
    End Sub

    Private Sub Method()
        Dim _result As StringBuilder = Nothing
        Dim _x As Double = 0.0R
        Dim _d As Integer = 0I
        Dim _q As Integer = 0I

        _result = New StringBuilder()

        _x = CType(Me.ArgX, Double)
        While (_x >= 4 And _x Mod 2 = 0)
            If _result.Length > 0 Then
                _result.Append(" * ")
            End If
            _result.Append("2")
            _x /= 2
            Thread.Sleep(25)
        End While
        _d = 3
        _q = CInt(_x / _d)
        While (_q >= _d)
            If (_x Mod _d = 0) Then
                If _result.Length > 0 Then
                    _result.Append(" * ")
                End If
                _result.Append(_d.ToString())
                _x = _q
            Else
                _d += 2
            End If
            _q = CInt(_x / _d)
            Thread.Sleep(25)
        End While
        If _result.Length > 0 Then
            _result.Append(" * ")
        End If
        _result.Append(_x)

        If Me._InnerTimer IsNot Nothing Then
            Me._InnerTimer.Dispose()
            Me._InnerTimer = Nothing
        End If

        Console.Write(Me.Name)
        Console.Write(" Priority : ")
        Console.Write(Me.Priority)
        Console.Write(" ArgX = ")
        Console.Write(Me.ArgX)
        Console.Write(" = ")
        Console.Write(_result.ToString())
        Console.WriteLine()

    End Sub

    Public ReadOnly Property Priority() As UInteger
        Get
            Return Me._Priority
        End Get
    End Property

    Public ReadOnly Property ArgX() As UInteger
        Get
            Return Me._ArgX
        End Get
    End Property

    Public ReadOnly Property Name() As String
        Get
            Return Me._Name
        End Get
    End Property

    Public ReadOnly Property IsAlive() As Boolean
        Get
            Return Me._InnerThread.IsAlive
        End Get
    End Property

    Public ReadOnly Property StartTime() As DateTime
        Get
            Return Me._StartTime
        End Get
    End Property

End Class


超適当だからまるコピーして使おうとしちゃダメよ(^_^;
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-21 00:57
質問者が不在のまま、これ以上想像で書き込みし続ける
事を、不毛に感じられてならない。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-11-21 10:07
引用:

にーさんの書き込み (2008-11-21 00:57) より:
質問者が不在のまま、これ以上想像で書き込みし続ける
事を、不毛に感じられてならない。


スレッドの本題と関係ない話題ですみませんが、にーさんがこのスレッドのどの点に着目されて発言されたのかわからないので、よかったら教えてください。

いちおう私は、2008-11-20 10:37 のしんさんの書き込みからわかる範囲で(「30秒周期で」を読み飛ばしていましたが)回答したつもりで、想像と言われるほど想像力を働かせたつもりもないのですが、にーさんから見て何かまずいことをしてしまいましたか?

あるいは、相手の話がよく理解できなかったときに、それを自分の言葉に置き換えて「それはもしかするとこういうことですか?」と相手に確認を求めること(未記入さんとセラフさんの回答の意図を私はこう解釈したわけですが)を指して不毛と言われてますか?

それと不在とはどういうことですか? 最後のしんさんの書き込みと、にーさんの書き込みは大体12時間あいていますが、半日書き込みがなかったら不在と言われちゃうんですか?

----- 追記
PMでいいので、よかったら教えてください。
どういう考えで、ということがわかればそれで満足ですので、考えに対してあれこれ言ったりしないことは約束します。

上の書き込みが、非難めいた物言いになってしまったことについては謝ります。

[ メッセージ編集済み 編集者: rain 編集日時 2008-11-21 12:08 ]
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2008-11-21 11:18
まぁまぁ落ち着いてくださいw

他の方はどうかわかりませんが、私は答えを提示することだけがこの掲示板の意義ではないと常々考えております。私もプログラムを始めたばかりの頃は、(どう質問していいか)わからないことが多々ありました。そういった人たちが本当に求めている答えを導き出すことは、システムのプロではない一般のお客様と対話して、うわべの要件ではなく本当に求めているものを探し出す力、考え方を学ぶには非常に良い訓練になりませんでしょうか?

ですから、極論すれば、私が回答している内容は全て自分の訓練のためでり、自己満足でしかありません。しかし、そういった利害の一致がこの掲示板に人を呼ぶ力を生んでいるのだと思います。

ですから、不毛だと思う人がいるなら、それはそれでよろしいのではないでしょうか?

また、書き込んだ本人ではない、いわゆるROMといわれている人の中にも、書き込みの流れから必要な情報を抜き出し、自分のプロジェクトに生かす人もいるはずです。このスレッドが例え最終的な答えにたどりつかなくとも、我々の書き込みの過程で何かを学び、新たな疑問が浮かび、新たな質問を投稿してくださる方も居るでしょう。

それを全て不毛とおっしゃるなら、その人の考え方ですから、私からは何も言うことはありません。

うまく質問できないからといって二の足を踏み、頻繁には回答できないからといって書き込みをためらい、そうやって人が減っていくことのほうが私には苦痛です。

確かに質問の意図がイマイチわからず、我々の書き込みに回答はいただけていませんが、だからといってだれも返信しない掲示板になってしまっては、誰も人が来なくなってしまいますよね?

私も今後は注意いたしますが、この掲示板はこういったくだらない言い争いをする場ではないと思います。不毛と思ったのは人それぞれだと思いますが、回答者の方々に不快な思いをさせてまで、発言する内容だったでしょうか?

答えは、それぞれが胸のうちに収めて、今回は終わりにしましょう。

以降、スレ主の質問の趣旨から外れる書き込みは自重ねがいます。

長文失礼いたしました。

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