- PR -

スレッドからデリゲートでフリーズ

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2007-12-10 19:14
スレッドからデリゲートを通して
11のテキストボックスに値を代入するという操作をしているのですが
たまに固まって何も反応しなくなります。
いつもじゃなくたまになのです。
エラーも出ていませんし、CPUがめえいっぱいになるかというと
そうでもありません。
これはよくある症状なのでしょうか?
それとも僕のプログラム独特のことなのでしょうか?
皆さんの経験談や知識をご紹介いただければありがたいです。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-12-10 20:40
実際、どんなコード書いたかによるんじゃない?
必要最小限のデリゲート回りのコードを提示していただけます?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-12-10 20:49
そもそもSTAThreadのフォームアプリケーションでまともにスレッドが利用できるんでしょうか?
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2007-12-10 20:57
ご助言ありがとうございます。

僕はずっとこの問題に頭をかかえていて
ほとほと困っておりまして質問させていただいたしだいですが

質問させていただいてから気づいたのが
デリゲートの操作の前と後に
MutexのWaitOne()でとめてReleaseMutex()で開放するといった
ことをしております。

しかも、コードファイルを4つ使っており(以下ABCDであらわします)
BファイルでWaitOne()をしてデリゲートを通してAでやりたい操作をし
Bで開放するといったことの途中でフリーズします。
Aで操作をしようとしたときです。
ただ、確認してみたところAでWaitOne()でとまっている別の操作がございました。
なので、したい操作をAではなくBに記述したところ
ストップしなくなったのです。

つまり、AのコードファイルでWaitOne()がかかっていたら
Aの他の操作はBから来た操作でもとまってしまうのかと思いました。
これで解決した感じがしますが違いましたらご助言いただければありがたいです。

まだ、途中ですのでなんともいいがたいのですが
自己解決できそうな感じです。
その時はお騒がせしまして申し訳ございませんでした。
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2007-12-10 21:19
実際のコード書いてください・・・。

本当にReleaseMutexは確実に呼ばれていますか?
例外が発生するなどして呼ばれていないということはありませんか?
Unmanagedからの呼び出されるメソッドから投げられた例外はキャッチできなくなってしまうので注意してください。

そもそもMutexじゃなくて、lockステートメントじゃだめなんですか?

それから非同期にControlを扱う場合、Control.BeginInvokeを使わなければいけませんが使っていますか?
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 2007-12-10 21:27
otfさん。すいません。
コードファイル間でデリゲートするのではなく
そのコードファイル内でデリゲートしたら
Mutexでひっかからなくなり
問題がなくなりました。
お騒がせしてもうしわけありません。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-12-10 21:56
根本的には解決してない可能性も高いと思うのですが…
いらないところを削ったコードをのせてみてはどうですか?

文章で処理を説明されてもわかりません。
未記入
大ベテラン
会議室デビュー日: 2005/08/25
投稿数: 145
投稿日時: 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の仕様はこれで正解なのでしょうか?

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