tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルスレッドの分岐処理について
記事No10692
投稿日: 2012/02/26(Sun) 16:17
投稿者rauichi
VB2005にて以下のようなコードでスレッドの分岐処理を実行したいのですが,どうしてもスレッドtだけがうまく実行されません.
(分岐処理をせずに,片一方だけでスレッドを起動させた場合はどちらのスレッドにおいてもうまく実行されることは確認できています.なお,スレッドtのパラメータmeasureAの方がスレッドtのパラメータmeasureBよりも処理内容は多くなっています.)
どうすれば解決できるかをご教授ください.よろしくお願いします.

public sub measure(Bybal n As Integer)

dim s As Settings = Settings.GetSettings

If (s.GetValue("Main","kikai").ToUpper = "kikaiA") then

   Dim t As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf MeasureA))
   t.isBackground = true
   t.Start(n)
Else If (s.GetValue("Main","kikai").ToUpper = "kikaiB")  Then

   Dim t1 As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf MeasureB))
   t1.isBackground = true
   t1.Start(n)

End If

End sub

[ツリー表示へ]
タイトルRe: スレッドの分岐処理について
記事No10693
投稿日: 2012/02/26(Sun) 18:36
投稿者YuO
> VB2005にて以下のようなコードでスレッドの分岐処理を実行したいのですが,どうしてもスレッドtだけがうまく実行されません.

「うまく実行されない」とはどういう状況が起きているのでしょうか。

Thread.Startが呼ばれて戻ってきたのであれば,実行はなされるはずです。
おそらく意図したように動かなかった,という意味でしょうが,
その「意図」と「実際の結果」を提示してみてください。


ところで,
> If (s.GetValue("Main","kikai").ToUpper = "kikaiA") then
> Else If (s.GetValue("Main","kikai").ToUpper = "kikaiB")  Then
わざわざToUpperして小文字を含む文字列と比較していますが,何か意図があるのでしょうか。

[ツリー表示へ]
タイトルRe^2: スレッドの分岐処理について
記事No10694
投稿日: 2012/02/26(Sun) 19:34
投稿者rauichi
> > VB2005にて以下のようなコードでスレッドの分岐処理を実行したいのですが,どうしてもスレッドtだけがうまく実行されません.
>
> 「うまく実行されない」とはどういう状況が起きているのでしょうか。
>
> Thread.Startが呼ばれて戻ってきたのであれば,実行はなされるはずです。
> おそらく意図したように動かなかった,という意味でしょうが,
> その「意図」と「実際の結果」を提示してみてください。
>
>
> ところで,
> > If (s.GetValue("Main","kikai").ToUpper = "kikaiA") then
> > Else If (s.GetValue("Main","kikai").ToUpper = "kikaiB")  Then
> わざわざToUpperして小文字を含む文字列と比較していますが,何か意図があるのでしょうか。

説明不足ですみません.

測定した値を測定した順番に配列に格納していく処理を実施しています.
(measureAは2項目の測定値を配列に格納し,2項目目の測定値の格納後に測定値格納の通知(測定値格納1回目完了)
measureBは1項目の測定値を配列に格納し,1項目目の測定値の格納後に測定値格納の通知(測定値格納1回目完了))

意図したように動かなかったという意味で,measureAは測定値格納90回目でスレッドが勝手に停止してしまう状態です.

なお,文字列の大文字化には特に意図はありません.

[ツリー表示へ]
タイトルRe^3: スレッドの分岐処理について
記事No10697
投稿日: 2012/02/27(Mon) 13:03
投稿者YuO
> 測定した値を測定した順番に配列に格納していく処理を実施しています.
> (measureAは2項目の測定値を配列に格納し,2項目目の測定値の格納後に測定値格納の通知(測定値格納1回目完了)
> measureBは1項目の測定値を配列に格納し,1項目目の測定値の格納後に測定値格納の通知(測定値格納1回目完了))
> 意図したように動かなかったという意味で,measureAは測定値格納90回目でスレッドが勝手に停止してしまう状態です.

勝手に停止してしまうというのは,どういうことでしょうか。
スレッドが勝手に停止する,というのは聞いたことがありません。
例外が発生したのに無視している,といったことはありませんか。
この内容から予想できるのはそのくらいですが……。

[ツリー表示へ]
タイトルRe^3: スレッドの分岐処理について
記事No10698
投稿日: 2012/02/27(Mon) 14:26
投稿者魔界の仮面弁士
> measureAは2項目の測定値を配列に格納し,2項目目の
> 測定値の格納後に測定値格納の通知(測定値格納1回目完了)
>
> measureBは1項目の測定値を配列に格納し,1項目目の
> 測定値の格納後に測定値格納の通知(測定値格納1回目完了)

それぞれのスレッドは、スレッドセーフであることが保証されているでしょうか。

また、例外対策は実施されていますか?
http://gushwell.ldblog.jp/archives/23832333.html


>> わざわざToUpperして小文字を含む文字列と比較していますが,何か意図があるのでしょうか。
> 文字列の大文字化には特に意図はありません.
ToUpper で大文字化された文字列が "kikaiA" や "kikaiB" と
一致するはずは無いので、t や t1 のスレッドは
どうやっても実行されないように思えます。

# それ以前に、そもそも元のコードは文法違反な気が……。(^_^;)

[ツリー表示へ]
タイトルRe^4: スレッドの分岐処理について
記事No10701
投稿日: 2012/02/27(Mon) 20:43
投稿者rauichi
> > measureAは2項目の測定値を配列に格納し,2項目目の
> > 測定値の格納後に測定値格納の通知(測定値格納1回目完了)
> >
> > measureBは1項目の測定値を配列に格納し,1項目目の
> > 測定値の格納後に測定値格納の通知(測定値格納1回目完了)
>
> それぞれのスレッドは、スレッドセーフであることが保証されているでしょうか。
>
> また、例外対策は実施されていますか?
> http://gushwell.ldblog.jp/archives/23832333.html
>
>
> >> わざわざToUpperして小文字を含む文字列と比較していますが,何か意図があるのでしょうか。
> > 文字列の大文字化には特に意図はありません.
> ToUpper で大文字化された文字列が "kikaiA" や "kikaiB" と
> 一致するはずは無いので、t や t1 のスレッドは
> どうやっても実行されないように思えます。
>
> # それ以前に、そもそも元のコードは文法違反な気が……。(^_^;)

たびたび説明不測ですいません.

スレッドを停止させるために,
設備エラーをわざと発生させて停止させる仕様になっています.

たとえば,100回の測定を実施するように引数を指定した場合は,
tのスレッドは90回目で意図した設備エラーと別の設備エラーで停止してしまう状況です.

スレッドセーフや例外対策は実施した方がよいのでしょうか.
できれば,VB2005での実施方法を教えていただけないでしょうか.
よろしくお願いします.

初めに紹介したコードに間違いがあったので,訂正版を以下に示します.
Public Sub measure(ByVal n As Integer)

Dim s As Settings = Settings.GetSettings

If (s.GetValue("Main","kikai").ToUpper = "KIKAIA") Then

   Dim t As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf MeasureA))
   t.isBackground = true
   t.Start(n)
ElseIf (s.GetValue("Main","kikai").ToUpper = "KIKAIB")  Then

   Dim t1 As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf MeasureB))
   t1.isBackground = true
   t1.Start(n)

End If

End Sub

[ツリー表示へ]
タイトルRe^5: スレッドの分岐処理について
記事No10702
投稿日: 2012/02/27(Mon) 21:36
投稿者魔界の仮面弁士
> 説明不測
?(^^;

> スレッドを停止させるために,
> 設備エラーをわざと発生させて停止させる仕様になっています.
停止させるための設備エラーというのは、どのような処理でしょうか?

> たとえば,100回の測定を実施するように引数を指定した場合は,
> tのスレッドは90回目で意図した設備エラーと別の設備エラーで停止してしまう状況です.
「わざと停止させる仕様」の部分に問題が無いかどうかは確認されましたか?

> スレッドセーフや例外対策は実施した方がよいのでしょうか.
スレッドを使う以上、スレッドセーフを保証することは必須ですね。

一方、例外対策については自己判断で良いと思います。
スレッド内で発生した例外は、そのままではメインスレッド側には
通知されないので、それで問題が無いというのであれば Try は不要かと。
(処理すべき例外が特に無いパターンもあるでしょうし)


> できれば,VB2005での実施方法を教えていただけないでしょうか.
知りたいのは、どの点に関してでしょうか?

[ツリー表示へ]