- くだすれDelphi(超初心者用)その55
786 :デフォルトの名無しさん[sage]:2014/03/28(金) 06:56:10.22 ID:d6QGntWj - >>785
いやおそらく理解は十分だと思いますよ。 おそらくA3型を前提とした質問だと思うのでそうとして答えますね。 (もしそうでなかったら無視してください) まず 767 の TForm1.FormDestroy; begin if Assigned(Mythread) then mythread.Free; end; というFreeは、「親が子より先には死んではいけない」という親子型の基本理念を実現するものですので ここでウェイトが生じうることは我慢して下さい。 逆に言えば FreeOnTerminate=true だとその理念が無いために A1型やA2型ではいろいろ苦労されてい るはずです。 子が親の予想より早く死んでしまったためアクセスバイオレーションとなることは既に書きましたが 親が子の予想より早く死んでしまったためアクセスバイオレーションとなることもあるというわけです。
|
- くだすれDelphi(超初心者用)その55
787 :デフォルトの名無しさん[sage]:2014/03/28(金) 06:58:04.75 ID:d6QGntWj - 次に 767 の
TForm1.Timer1Timer; begin if Assigned(mythread) and mythread.finished then begin mythread.Free; mythread:= nil; end; という部分での Free ですがここはmythreadが処理を完了していますので Freeでウエイトが生じることはないはずです。
|
- くだすれDelphi(超初心者用)その55
788 :デフォルトの名無しさん[sage]:2014/03/28(金) 07:07:12.92 ID:d6QGntWj - 最後に 767 の
TForm1.Button1click; begin if Assigned(mythread) then mythread.Free; mythread:= TMyThread.create; end; という部分でのウェイトですがここはサブスレッドを1つだけに制限しているため Freeして使いまわしているだけです。複数のサブスレッドを作るようにすればここでのFreeは不要です。 例えば、HTTPサーバーでリッスンするスレッドに接続要求があった時は接続可能な数まで サブスレッドを作成するだけでいちいちFreeはしないと思います。
|
- くだすれDelphi(超初心者用)その55
789 :デフォルトの名無しさん[sage]:2014/03/28(金) 07:13:34.20 ID:d6QGntWj - >>784
「別のスレットがmythreadを使う」というプログラムがよくわからないので 具体例を示していただけると幸いです。 FreeOnTerminate=trueだとそういうプログラムでも問題が生じないという ところまで示していただけると多分今後スムーズに話が進みます。
|
- くだすれDelphi(超初心者用)その55
790 :デフォルトの名無しさん[sage]:2014/03/28(金) 07:24:05.61 ID:d6QGntWj - >>784
なお、「別のスレットがmythreadを使う」がもし「子スレッドが複数いて子同士での通信」を意味するなら mythreadを使うのではなくsyncronizeや同期オブジェクトやスレッド間通信を使ったほうがよいと思います。 それはFreeOnTerminate=trueでも同じのはずです。
|