トップページ > プログラム > 2014年03月19日 > 2cESFier

書き込み順位&時間帯一覧

11 位/224 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000410000000000100006



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
プログラム板 強制ID導入議論スレッド
くだすれDelphi(超初心者用)その55

書き込みレス一覧

プログラム板 強制ID導入議論スレッド
888 :デフォルトの名無しさん[sage]:2014/03/19(水) 07:18:36.22 ID:2cESFier

くだすれ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 のつくりがこういう使い方を想定して作られてる」というのは誤解と思われます。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。