スレッド中に別スレッドを起動する方法

解決


でるでる  2007-01-31 13:49:48  No: 24687  IP: 192.*.*.*

お世話になります。
スレッド中に別スレッドを起動する方法がわかりません。
コーディングしてみたのですが、別スレッドが起動しているのですが、
元スレッドの中で動いています。
TSubThreadがSleep(1000)の間走ってくれると意図したのですが...
コードです
Procedure TMainThread.Execute
begin
   無限ループ
   aaaaaa;
   Sleep(1000)
   if  条件 then bbbbb;

end;

bbbbb:
TSubThread起動

編集 削除
えーと  2007-02-01 18:09:49  No: 24688  IP: 192.*.*.*

スレッド自体がわかってませんね。まずそこから。Demos のなかに例がありませんか?

編集 削除
でるでる  2007-02-05 09:02:22  No: 24689  IP: 192.*.*.*

えーとさん、ありがとございます。
Demosの中のTHREADプログラムを見たのですが、スレッドを実行している
タイミングが全て同じなのです。

編集 削除
でるでる  2007-02-05 14:18:35  No: 24690  IP: 192.*.*.*

自己レスです。
「スレッド中に別スレッドを起動する方法」とタイトルに書き込みましたが
わかりずらいですね。
「スレッド中に条件によって別スレッドを起動する」という事です。
ネットで調べている最中ですが、無いですね。出来ないのでしょうか?
とりあえず、全てのスレッドを起動して、実行したい時、したくない時と
フラグを立ててスレッドを動かすようにしています。
この方法がベストなのでしょうか?

編集 削除
うんと  2007-02-05 18:23:51  No: 24691  IP: 192.*.*.*

スレッドという語句の意味が間違って使われているようです。意味がまったく分かりません。

編集 削除
でるでる  2007-02-07 10:34:25  No: 24692  IP: 192.*.*.*

勉強不足ですいません。
したい事は
スレッドA、スレッドB、スレッドCを平行処理させる事はできます(優先順位をつけて)
スレッドCの実行中に条件によってスレッドDをする方法がわからないのです。

編集 削除
でるでる  2007-02-07 10:34:25  No: 24693  IP: 192.*.*.*

勉強不足ですいません。
したい事は
スレッドA、スレッドB、スレッドCを平行処理させる事はできます(優先順位をつけて)
スレッドCの実行中に条件によってスレッドDをする方法がわからないのです。

編集 削除
りっきぃ  2007-02-08 14:41:17  No: 24694  IP: 192.*.*.*

スレッドA〜Dまで作成する。(このときスレッドDはサスペンドにする)
スレッドC内で条件を満たしたときDを再開させる

一番上のコードはスレッドC内でスレッドDを作成するように組んであるのでスレッドC内で条件を満たすまでスレッドDが動作しないのは当たり前です。
(あなたはそういうコーディングをしています)

スレッドの一時停止はSuspendメソッド、スレッドの再開はResumeメソッドです。
「スレッドDをする」という表現がいまいちよくわからないので勘で答えてますので違っていたらごめんなさい ^^;

編集 削除
でるでる  2007-02-09 10:32:23  No: 24695  IP: 192.*.*.*

りっきぃさん、ありがとうございます。
SuspendとResumemeメソッドを使ったプログラムを作成したのですが、
1回しかスレッド処理してくれません。

コードです
procedure TForm1.FormCreate(Sender: TObject);
begin
  Thread1 := Thread.Create(True);
  Thread1.Priority := tpHighest;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Thread1.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Thread1.Suspend;
end;

なおスレッドコードはPANELにインクリメントした数値を表示するだけです。
(何回処理が走ったか確認の為)

編集 削除
りっきぃ  2007-02-09 13:03:56  No: 24696  IP: 192.*.*.*

Delphiのヘルプは読みましたか?

スレッドの寿命はExecuteメソッドが完了するまでです。
繰り返し処理を行いたい場合はTerminatedプロパティがTrueになるまで繰り返すなどの処理を行うとよいでしょう。
TThreadのExecuteメソッドをヘルプで参照すると例が載っています。

編集 削除
りっきぃ  2007-02-09 13:20:05  No: 24697  IP: 192.*.*.*

あと気になる点がひとつ・・・

>なおスレッドコードはPANELにインクリメントした数値を表示するだけです。

これって別スレッドでやる必要があるのでしょうか?
スレッドセーフを考慮するとむしろやらないほうがいいような・・・

編集 削除
でるでる  2007-02-09 14:26:13  No: 24698  IP: 192.*.*.*

りっきぃさん、ありがとうございます。
>スレッドの寿命はExecuteメソッドが完了するまでです。
SuspendとResumemeメソッドを使ったプログラムは1回で終了で正常なのですね。完了したスレッドにSuspendメソッドをしても意味がないわけですから...もちろんResumemeも。

TThreadのExecuteメソッドをヘルプで参照すると
「注意  Execute メソッドの中から他のオブジェクトのメソッドやプロパティを直接使用しないでください。」と書いてありました。するなら続きの手
順にしたがって行うのですね。
だから、最初に書いたコード(スレッドから別スレッドを起動する)は
してはいけない事だったのですね。どうもおかしな動きをするはずでした。

解決しました。アドバイスして貰った人に感謝です!。

編集 削除
えーと  2007-02-09 17:56:36  No: 24699  IP: 192.*.*.*

>だから、最初に書いたコード(スレッドから別スレッドを起動する)は
>してはいけない事だったのですね。どうもおかしな動きをするはずでした。

別のスレッドでつくったコンポーネントや変数に排他処理をしないで
アクセスするのは、いつだって危険です。スレッドからスレッドをいつ、いくつ
つくろうが、それとは関係ありません。

編集 削除
でるでる  2007-02-14 18:09:24  No: 24700  IP: 192.*.*.*

えーとさん、ありがとうございます。
>スレッドから別スレッドを起動する)はしてはいけない事だったのですね。
訂正します。しても問題ないですね。

編集 削除