- PR -

join でフリーズ

投稿者投稿内容
未記入
会議室デビュー日: 2008/03/31
投稿数: 9
投稿日時: 2008-04-01 09:50
初心者で申し訳ありません。
スレッドを使った処理を作成しているのですがどうもうまくいきません。
単純にスレッドを作成してDLLを呼び出しているだけなのですがjoinのところでフリーズしてしまいます。

コードはこんな感じです。
class TestA
dim obj as object
public sub new()
obj = new object()
end sub

public sub main()
dim t as thread
t = new system.threading.thread(new system.threading.threadstart(address of do))
t.start()
t.join()
end sub

public sub do()
obj.start()
end sub
enc class

後で強制終了の処理とかを入れたいのでこのやり方でやっているのですが・・・
すみませんがご教授願います。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-04-01 16:53
「フリーズ」の意味が、いまいちわかりませんが
"フリーズ=スレッド(処理)が止まる"であるならば・・・

Joinは、該当スレッドの終了を待機するメソッドです。

Joinがコールされた時点で、別スレッド(doメソッド)の終了を待機するので
そこでメインスレッドが停止するのは当然でしょう。


"フリーズ=プロセスが止まる"であるならば
現時点での提示情報では、原因特定・推測は困難です。
未記入
会議室デビュー日: 2008/03/31
投稿数: 9
投稿日時: 2008-04-01 23:45
返答ありがとうございます。
>「フリーズ」の意味が、いまいちわかりませんが
フリーズ=プロセスが止まります。

joinをとると正常に動きますしobj.start()以外の処理
例えば
for i = 0 To 999999
debug.writeln(i)
next
とかを入れても正常に動作します。

-------------------------------------------------
class TestA
dim obj as object
public sub new()
obj = new object()
end sub

public sub main()
dim t as thread
t = new system.threading.thread(new system.threading.threadstart(address of do))
t.start()
debug.write("C") ←追加
t.join(5000) ←タイムアウトを追加
debug.write("D") ←追加
end sub

public sub do()
debug.write("A") ←追加
obj.start()
debug.write("B") ←追加
end sub
enc class
-------------------------------------------------
上記のように修正を行って実行してみたら
ACDB
の順で表示されてしまいます。

普通なら
ABCD
となると思うのですが・・・
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-01 23:52
引用:

未記入さんの書き込み (2008-04-01 23:45) より:
上記のように修正を行って実行してみたら
ACDB
の順で表示されてしまいます。

普通なら
ABCD
となると思うのですが・・・


 A と C が表示される順序は不定です。
 obj.start() メソッドにかかる時間によって、B と D が出力される順序は変わります。「A の後に B。C の後に D。」が表示されるのは確実ですが、A, C、B, D の出力順は不定です。
未記入
会議室デビュー日: 2008/03/31
投稿数: 9
投稿日時: 2008-04-02 08:26
Jittaさんありがとうございます。
確かにAとCの順番は不定なのでしょうが
obj.startの中にdebug.write("x")を書き込み実行してみると
出力結果がACDXBとなってしまいました。
またjoinのタイムアウトを外すとプロセスが停止してしまい
出力結果はACでとまります。

よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-04-02 09:23
最初の投稿にあるobj.start()って何ですか?
objはObject型として宣言しているので、startなんてメソッドはありませんし。
「こんな感じ」ということなので、実際のstartメソッドに当たる内容は
提示のコードとは違うのですよね?

DよりBが先に表示されるということは、t.joinはタイムアウトでしか成功していない
ということですし、タイムアウトを設定して返ってこないということは、
スレッドtが終了していないということですよね。

obj.start()は終了するメソッドなのでしょうか?
また、デッドロックを引き起こすようなコーディングはしていないでしょうか?

最初の投稿には、

> 単純にスレッドを作成してDLLを呼び出しているだけなのですがjoinのところでフリーズしてしまいます。

というご説明がありますが、このDLLはどういうDLLなんでしょうか?
DLLの呼び出しから帰ってきていないということはないでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-04-02 09:45
引用:

未記入さんの書き込み (2008-04-01 23:45) より:
返答ありがとうございます。
>「フリーズ」の意味が、いまいちわかりませんが
フリーズ=プロセスが止まります。

普通なら
ABCD
となると思うのですが・・・



「プロセスの停止」とは、なにをもって判断しているのでしょう?

私的には、obj.start()メソッドの処理にかなり時間がかかっていて
あたかも「プロセスが停止」しているかのようになっているだけのように思えます。
現にスレッド待機にタイムアウトを入れると、"D"と"B"も出力されているわけですし
メインスレッドは正しく動いていませんかね。

「フリーズ」ではなく、生成した別スレッドがなかなか終了しない。
ってだけではないでしょうか。
obj.start()の処理。その中で呼び出しているDLLメソッドの処理。
この辺りが、貴方のおっしゃる「フリーズ」を引き起こしている「重い処理」ではないでしょうか?

つまり・・・
引用:

joinをとると正常に動きますしobj.start()以外の処理
例えば
for i = 0 To 999999
debug.writeln(i)
next
とかを入れても正常に動作します。



↓10分掛かる思い処理
コード:

For i = 0 To 600
Thread.Sleep(1000)
Next


とかを入れると「フリーズ」ってなるんですか?

for i = 0 To 999999
 debug.writeln(i)
next
↑この程度のループ、PCの性能にもよりますが、一瞬で終わりますよ。

[誤字修正]
誤:↓10分掛かる思い処理
正:↓10分掛かる重い処理

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-04-02 09:48 ]
未記入
会議室デビュー日: 2008/03/31
投稿数: 9
投稿日時: 2008-04-02 15:31
回答が遅くなり申し訳ないです。

obj.start()は特に重い処理でもなんでもありません。
joinを外すと一瞬で終わります。
joinをつけていたらいつまで待っても終わらないのです。

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