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

解決


山本健吾  2006-07-09 22:29:00  No: 22452

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 23:30:28  No: 22453

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


山本健吾  2006-07-10 05:13:28  No: 22454

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

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


えーと  2006-07-10 07:58:16  No: 22455

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

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


山本健吾  2006-07-10 11:33:06  No: 22456

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加