お世話になります。
スレッド中に別スレッドを起動する方法がわかりません。
コーディングしてみたのですが、別スレッドが起動しているのですが、
元スレッドの中で動いています。
TSubThreadがSleep(1000)の間走ってくれると意図したのですが...
コードです
Procedure TMainThread.Execute
begin
無限ループ
aaaaaa;
Sleep(1000)
if 条件 then bbbbb;
end;
bbbbb:
TSubThread起動
スレッド自体がわかってませんね。まずそこから。Demos のなかに例がありませんか?
えーとさん、ありがとございます。
Demosの中のTHREADプログラムを見たのですが、スレッドを実行している
タイミングが全て同じなのです。
自己レスです。
「スレッド中に別スレッドを起動する方法」とタイトルに書き込みましたが
わかりずらいですね。
「スレッド中に条件によって別スレッドを起動する」という事です。
ネットで調べている最中ですが、無いですね。出来ないのでしょうか?
とりあえず、全てのスレッドを起動して、実行したい時、したくない時と
フラグを立ててスレッドを動かすようにしています。
この方法がベストなのでしょうか?
スレッドという語句の意味が間違って使われているようです。意味がまったく分かりません。
勉強不足ですいません。
したい事は
スレッドA、スレッドB、スレッドCを平行処理させる事はできます(優先順位をつけて)
スレッドCの実行中に条件によってスレッドDをする方法がわからないのです。
勉強不足ですいません。
したい事は
スレッドA、スレッドB、スレッドCを平行処理させる事はできます(優先順位をつけて)
スレッドCの実行中に条件によってスレッドDをする方法がわからないのです。
スレッドA〜Dまで作成する。(このときスレッドDはサスペンドにする)
スレッドC内で条件を満たしたときDを再開させる
一番上のコードはスレッドC内でスレッドDを作成するように組んであるのでスレッドC内で条件を満たすまでスレッドDが動作しないのは当たり前です。
(あなたはそういうコーディングをしています)
スレッドの一時停止はSuspendメソッド、スレッドの再開はResumeメソッドです。
「スレッドDをする」という表現がいまいちよくわからないので勘で答えてますので違っていたらごめんなさい ^^;
りっきぃさん、ありがとうございます。
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にインクリメントした数値を表示するだけです。
(何回処理が走ったか確認の為)
Delphiのヘルプは読みましたか?
スレッドの寿命はExecuteメソッドが完了するまでです。
繰り返し処理を行いたい場合はTerminatedプロパティがTrueになるまで繰り返すなどの処理を行うとよいでしょう。
TThreadのExecuteメソッドをヘルプで参照すると例が載っています。
あと気になる点がひとつ・・・
>なおスレッドコードはPANELにインクリメントした数値を表示するだけです。
これって別スレッドでやる必要があるのでしょうか?
スレッドセーフを考慮するとむしろやらないほうがいいような・・・
りっきぃさん、ありがとうございます。
>スレッドの寿命はExecuteメソッドが完了するまでです。
SuspendとResumemeメソッドを使ったプログラムは1回で終了で正常なのですね。完了したスレッドにSuspendメソッドをしても意味がないわけですから...もちろんResumemeも。
TThreadのExecuteメソッドをヘルプで参照すると
「注意 Execute メソッドの中から他のオブジェクトのメソッドやプロパティを直接使用しないでください。」と書いてありました。するなら続きの手
順にしたがって行うのですね。
だから、最初に書いたコード(スレッドから別スレッドを起動する)は
してはいけない事だったのですね。どうもおかしな動きをするはずでした。
解決しました。アドバイスして貰った人に感謝です!。
>だから、最初に書いたコード(スレッドから別スレッドを起動する)は
>してはいけない事だったのですね。どうもおかしな動きをするはずでした。
別のスレッドでつくったコンポーネントや変数に排他処理をしないで
アクセスするのは、いつだって危険です。スレッドからスレッドをいつ、いくつ
つくろうが、それとは関係ありません。
えーとさん、ありがとうございます。
>スレッドから別スレッドを起動する)はしてはいけない事だったのですね。
訂正します。しても問題ないですね。
ツイート | ![]() |