- - PR -
join でフリーズ
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-04-01 16:53
「フリーズ」の意味が、いまいちわかりませんが
"フリーズ=スレッド(処理)が止まる"であるならば・・・ Joinは、該当スレッドの終了を待機するメソッドです。 Joinがコールされた時点で、別スレッド(doメソッド)の終了を待機するので そこでメインスレッドが停止するのは当然でしょう。 "フリーズ=プロセスが止まる"であるならば 現時点での提示情報では、原因特定・推測は困難です。 | ||||||||||||
|
投稿日時: 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 となると思うのですが・・・ | ||||||||||||
|
投稿日時: 2008-04-01 23:52
A と C が表示される順序は不定です。 obj.start() メソッドにかかる時間によって、B と D が出力される順序は変わります。「A の後に B。C の後に D。」が表示されるのは確実ですが、A, C、B, D の出力順は不定です。 | ||||||||||||
|
投稿日時: 2008-04-02 08:26
Jittaさんありがとうございます。
確かにAとCの順番は不定なのでしょうが obj.startの中にdebug.write("x")を書き込み実行してみると 出力結果がACDXBとなってしまいました。 またjoinのタイムアウトを外すとプロセスが停止してしまい 出力結果はACでとまります。 | ||||||||||||
|
投稿日時: 2008-04-02 09:23
最初の投稿にあるobj.start()って何ですか?
objはObject型として宣言しているので、startなんてメソッドはありませんし。 「こんな感じ」ということなので、実際のstartメソッドに当たる内容は 提示のコードとは違うのですよね? DよりBが先に表示されるということは、t.joinはタイムアウトでしか成功していない ということですし、タイムアウトを設定して返ってこないということは、 スレッドtが終了していないということですよね。 obj.start()は終了するメソッドなのでしょうか? また、デッドロックを引き起こすようなコーディングはしていないでしょうか? 最初の投稿には、 > 単純にスレッドを作成してDLLを呼び出しているだけなのですがjoinのところでフリーズしてしまいます。 というご説明がありますが、このDLLはどういうDLLなんでしょうか? DLLの呼び出しから帰ってきていないということはないでしょうか? | ||||||||||||
|
投稿日時: 2008-04-02 09:45
「プロセスの停止」とは、なにをもって判断しているのでしょう? 私的には、obj.start()メソッドの処理にかなり時間がかかっていて あたかも「プロセスが停止」しているかのようになっているだけのように思えます。 現にスレッド待機にタイムアウトを入れると、"D"と"B"も出力されているわけですし メインスレッドは正しく動いていませんかね。 「フリーズ」ではなく、生成した別スレッドがなかなか終了しない。 ってだけではないでしょうか。 obj.start()の処理。その中で呼び出しているDLLメソッドの処理。 この辺りが、貴方のおっしゃる「フリーズ」を引き起こしている「重い処理」ではないでしょうか? つまり・・・
↓10分掛かる思い処理
とかを入れると「フリーズ」ってなるんですか? for i = 0 To 999999 debug.writeln(i) next ↑この程度のループ、PCの性能にもよりますが、一瞬で終わりますよ。 [誤字修正] 誤:↓10分掛かる思い処理 正:↓10分掛かる重い処理 [ メッセージ編集済み 編集者: くまっち 編集日時 2008-04-02 09:48 ] | ||||||||||||
|
投稿日時: 2008-04-02 15:31
回答が遅くなり申し訳ないです。
obj.start()は特に重い処理でもなんでもありません。 joinを外すと一瞬で終わります。 joinをつけていたらいつまで待っても終わらないのです。 |