- プログラム板 強制ID導入議論スレッド
888 :デフォルトの名無しさん[sage]:2014/03/19(水) 07:18:36.22 ID:2cESFier - t
|
- くだすれDelphi(超初心者用)その55
730 :デフォルトの名無しさん[sage]:2014/03/19(水) 07:21:28.20 ID:2cESFier - 例えばここ http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial/ja
のサンプルの中でFreeOnTerminate=trueにもかかわらず procedure TForm1.FormDestroy(Sender: TObject); begin MyThread.Terminate; // FreeOnTerminate が true であれば、以下の記述は必要ありません。 // MyThread.Free; inherited; end; などと平気でやっている。 MyThread が先に終了してたらMyThread.Terminateはアクセスバイオレーションだ! つまりFreeOnTerminate=trueの時はメインスレッドからサブスレッドを制御するのは サブスレッドの実体をメインスレッドに持っているだけではできないのだ。 そしてFreeOnTerminate=trueの唯一のメリットは「処理が終わったら余分なメモリが空くこと」だが それはFreeOnTerminate=falseでもスレッドリストを作りガベージコレクトを適切に行うことで解決できる。 これらのことからするとFreeOnTerminate=trueは実質いらない子なのである。
|
- くだすれDelphi(超初心者用)その55
731 :デフォルトの名無しさん[sage]:2014/03/19(水) 07:30:16.83 ID:2cESFier - ちなみに「スレッドリストを作りガベージコレクト」とは
単に、適当なタイミング(新しいスレッドを作るときとかタイマで10分毎とか、どうするかはプログラマの自由)で if MyThread.finished then MyThread.Free; とするだけのことである。 サブスレッドが複数なら for i:= 0 to thredlist.count-1 do if thredlist[i].finished then thredlist[i].Free; とかね。
|
- くだすれDelphi(超初心者用)その55
732 :デフォルトの名無しさん[sage]:2014/03/19(水) 07:42:15.76 ID:2cESFier - 初心者スレなのでさらに正確に書くと
if Assigned(MyThread) and MyThread.finished then begin MyThread.Free; MyThread:= nil; end; か。 なお以前は MyThread.Free; MyThread:= nil; を FreeAndNil(MyThread); にするとなぜかうまく行かなかったが今はどうか知らない。
|
- くだすれDelphi(超初心者用)その55
733 :デフォルトの名無しさん[sage]:2014/03/19(水) 08:22:24.10 ID:2cESFier - なお、もちろん「少量のメモリ使用なんて気にしない」という
ならガベージコレクトは不要だ。 仮にサブスレッドが大量のメモリを使うとしても、executeの 最後でそれらを開放してやればいいだけの話なので 眠ってるスレッドが消費するメモリなんてたかが知れている。
|
- くだすれDelphi(超初心者用)その55
737 :デフォルトの名無しさん[sage]:2014/03/19(水) 19:46:18.29 ID:2cESFier - >>735
「本来使われるべき場面」とは? ちなみに私がバカというのはあたってますが、 ガベージコレクトを標準搭載している言語ではごく普通の手法なので「自論」ではないです。 >>736 それだとメインの旗を立てる際にsyncronizeしないと いけないので私の提示したた手法より複雑になります。 そして「TThread のつくりがこういう使い方を想定して作られてる」というのは誤解と思われます。
|