ワーカスレッドがフォームを表示するには?

解決


山本健吾  2006-07-09 13:29:00  No: 22452  IP: 192.*.*.*

TThread.Executeの中で
procedure TThread.Execute;
var
  aForm: TForm2;
begin
  aForm := TForm2.Create(nil);
  aForm.ShowModal;
  aForm.Free;
end;
という処理を書いて実行したのですが、TForm2の描画がおかしくなります。
置いてあるはずのボタンが無くなったりします。
出るときもあります。(エラーの時もあります)
恐らく、スレッド内でTFormを作るなというのが正解と思われますが、
メインループから独立したフォームを作る事はできないものでしょうか。
開発環境はWinXP,Del6,Pen4×1のHyperTherdingです。

編集 削除
かみづ  2006-07-09 14:30:28  No: 22453  IP: 192.*.*.*

>恐らく、スレッド内でTFormを作るなというのが正解と思われますが、
VCLはマルチスレッドに対応していないので、必ずTThread.Synchronizeを
使用してメインスレッドに作らせる必要があります。

編集 削除
山本健吾  2006-07-09 20:13:28  No: 22454  IP: 192.*.*.*

かみづ さん
ご解答ありがとうございます。

> VCLはマルチスレッドに対応していないので
ですよねぇやはり。
TFromを使用しないと色々面倒なので困っています。
独自にごりごり書くしかないですね。

編集 削除
えーと  2006-07-09 22:58:16  No: 22455  IP: 192.*.*.*

> 独自にごりごり書くしかないですね。

TForm を使用しないで、CreateWindow() で作ってもワーカスレッド内で
メッセージループを回さないと GUI は動作しません。ですから、あまり
意味はないかと。GUI はメインスレッドで作って動作させるのが正解です。

編集 削除
山本健吾  2006-07-10 02:33:06  No: 22456  IP: 192.*.*.*

えーとさん
ご指摘ありがとうございます。
そうなんです、それが面倒なんです!
VCLがマルチスレッド対応しないかぎり(しないだろう)
プリミティブなコードを書かなければならないんです。
Delphi使う意味がないです。
結局天秤にかけて、メインスレッド一本で行くことにしました。

編集 削除