- - PR -
スレッドからデリゲートでフリーズ
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-12-10 19:14
スレッドからデリゲートを通して
11のテキストボックスに値を代入するという操作をしているのですが たまに固まって何も反応しなくなります。 いつもじゃなくたまになのです。 エラーも出ていませんし、CPUがめえいっぱいになるかというと そうでもありません。 これはよくある症状なのでしょうか? それとも僕のプログラム独特のことなのでしょうか? 皆さんの経験談や知識をご紹介いただければありがたいです。 |
|
投稿日時: 2007-12-10 20:40
実際、どんなコード書いたかによるんじゃない?
必要最小限のデリゲート回りのコードを提示していただけます? |
|
投稿日時: 2007-12-10 20:49
そもそもSTAThreadのフォームアプリケーションでまともにスレッドが利用できるんでしょうか?
|
|
投稿日時: 2007-12-10 20:57
ご助言ありがとうございます。
僕はずっとこの問題に頭をかかえていて ほとほと困っておりまして質問させていただいたしだいですが 質問させていただいてから気づいたのが デリゲートの操作の前と後に MutexのWaitOne()でとめてReleaseMutex()で開放するといった ことをしております。 しかも、コードファイルを4つ使っており(以下ABCDであらわします) BファイルでWaitOne()をしてデリゲートを通してAでやりたい操作をし Bで開放するといったことの途中でフリーズします。 Aで操作をしようとしたときです。 ただ、確認してみたところAでWaitOne()でとまっている別の操作がございました。 なので、したい操作をAではなくBに記述したところ ストップしなくなったのです。 つまり、AのコードファイルでWaitOne()がかかっていたら Aの他の操作はBから来た操作でもとまってしまうのかと思いました。 これで解決した感じがしますが違いましたらご助言いただければありがたいです。 まだ、途中ですのでなんともいいがたいのですが 自己解決できそうな感じです。 その時はお騒がせしまして申し訳ございませんでした。 |
|
投稿日時: 2007-12-10 21:19
実際のコード書いてください・・・。
本当にReleaseMutexは確実に呼ばれていますか? 例外が発生するなどして呼ばれていないということはありませんか? Unmanagedからの呼び出されるメソッドから投げられた例外はキャッチできなくなってしまうので注意してください。 そもそもMutexじゃなくて、lockステートメントじゃだめなんですか? それから非同期にControlを扱う場合、Control.BeginInvokeを使わなければいけませんが使っていますか? |
|
投稿日時: 2007-12-10 21:27
otfさん。すいません。
コードファイル間でデリゲートするのではなく そのコードファイル内でデリゲートしたら Mutexでひっかからなくなり 問題がなくなりました。 お騒がせしてもうしわけありません。 |
|
投稿日時: 2007-12-10 21:56
根本的には解決してない可能性も高いと思うのですが…
いらないところを削ったコードをのせてみてはどうですか? 文章で処理を説明されてもわかりません。 |
|
投稿日時: 2007-12-10 22:09
やっぱりわかりづらかったですか。
では簡略的に書かせていただきます。 コードA timer()//100ms間隔 { waitone(); いろんな処理 releasemutex() } delegate void del() privete void kokodetumaru() { テキストボックス11個に値を代入 } コードB スレッド内 waitone() Invoke(new del(kokodetumaru())); releasemutex() とかんな感じです。 つまりコードAのwaitone()でひっかかってるときに コードBから処理がきてつまってたんです。多分。 それでコードBにkokodetumaru()を記述したところ 問題が解消されました。 なのでMutexってそのコードファイル全体をブロック しちゃうのでこれって正常動作なんでしょうか? Mutexの仕様はこれで正解なのでしょうか? |