アプリの強制終了


ぺんね  2009-11-28 02:52:45  No: 36315

Delphiでつくったソフトを動かしているときに×ボタンで終了しても
処理の途中だったらなかなか、終了してくれません。

タスクマネージャーのプロセスから終了するような
ボタンをつけたいのですが方法はありますでしょうか?


Mr.XRAY  2009-11-28 03:03:12  No: 36316

Mr.XRAYです.

>ボタンをつけたいのですが方法はありますでしょうか?

そんなボタンはみたことがありませんが,
そのアプリ(フォーム)にボタンを配置して,Closeと書いても閉じないのであれば,
処理中という処理のコーディングを工夫する必要があるかも知れません.
だって,ボタンむ[×]をクリックしても,反応しないのですから.

どのような処理かもDelphiや他の環境も不明ですが,
以下の記事が,もし,参考になれば幸いです.

http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm


Mr.XRAY  2009-11-28 03:27:46  No: 36317

>http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm

このページでは主に,Application.ProcessMessages を使用していますが,
常にこの方法でうまくいくとは限りません.

処理内容によっては Application.ProcessMessages を使用すると処理が不安定に
なることがあります.
ご注意ください.


ぺんね  2009-11-28 05:28:52  No: 36318

早速のアドバイスありがとうございます。
Application.ProcessMessages は以前もしようした事がありまして
早速ためしたみたのですが、結局×と終了速度は同じでした。

なのでApplication.ProcessMessages でアプリ名を指定して
停止するアプリを作って試してみましたがこれも同じ結果でした。

タスクのプロセスって強烈ですねw
あれをDosのBatとかで実行できないですかね???


ぺんね  2009-11-28 05:49:02  No: 36319

すいません、勘違いしていました、私が使用したのは
PostMessage(FindWindow  です。

Application.ProcessMessages を調べてみたのですが
どのように使用するのでしょうか?この関数の意味が
よくわかりません。

すいません。


HOta  2009-11-28 07:07:54  No: 36320

Thredを使ってみればどうですか?


Mr.XRAY  2009-11-28 07:08:06  No: 36321

>この関数の意味が  よくわかりません。

>http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm

ここには,
「Application.ProcessMessageは,「その時対処しなければならないウィンドウメッ
セージをとりあえず処理」し,再描画が必要なら実行します.これは,...(以下略)」

または,Delphiのヘルプでは
http://docwiki.embarcadero.com/VCL/ja/Forms.TApplication.ProcessMessages

これ以上の説明は私にはできません.


ぺんね  2009-11-28 07:33:08  No: 36322

>>HOta
Thredとは何でしょうか・・・
どの様に使用すればよろしいですか?


Mr.XRAY  2009-11-28 09:23:11  No: 36323

Mr.XRAYです.

現在の環境にはヘルプがない,ということはないですよね?
TThreadという単語はみたことがなくても,「スレッド」という言葉はきいたことがある
と思います.

Windows はマルチスレッド何とかかんとか,というように.

Delphiのオンライン・ヘルプの多分(?)該当ページです.
Classes.TThread
http://docwiki.embarcadero.com/VCL/ja/Classes.TThread


Mr.XRAY  2009-11-28 09:32:58  No: 36324

更に追い討ちをかけて(笑).

インターネット.この掲示板を見たり,書き込んだりしていますので,
接続しているわけですね.
インターネットでは「検索」という便利な機能があります.

例えば以下のURLで「TThreadとは」とか
「TThread Delphi」で検索すると,いろいな情報を得ることができます.
他の方に検索してもらってレスしてもらうのもいいかも知れませんが,
自分で時間をかけて調べたものは,結構身につきますよ.

http://www.google.co.jp/


KHE00221  2009-11-28 12:21:02  No: 36325

procedure
 長い処理
end;

この長い処理中にボタンを押すとメッセージがスタックされて
procedure 〜 end; の処理が終わった後に処理される

PoseMessage でメッセージを送ってもメッセージがスタックされる
だけなので当然

>早速ためしたみたのですが、結局×と終了速度は同じでした。

となる

Application.ProcessMessages があるとその時点でメッセージを
処理してくれるようになるので X を押すことは可能となる
がアプリケーションの終了は出来ないので

http://mrxray.on.coocan.jp/Delphi/plSamples/840_CancellLockDisable.htm

にあるように長い処理(ループ?)を抜けるようにしなければならない

>タスクのプロセスって強烈ですねw
>あれをDosのBatとかで実行できないですかね???

プロセスの一覧取得と強制終了
http://khe00221.image.coocan.jp/index.php?FrontPage%2FTips2%2F%A5%B7%A5%B9%A5%C6%A5%E0%20-%20%A5%D7%A5%ED%A5%BB%A5%B9%2F%B0%EC%CD%F7%BC%E8%C6%C0%A4%C8%B6%AF%C0%A9%BD%AA%CE%BB

でスレッドでどうしろと?


Mr.XRAY  2009-11-29 03:04:56  No: 36326

ものはついでに.参考としてです.

>タスクのプロセスって強烈ですねw
>あれをDosのBatとかで実行できないですかね???

いずれにしてもボタンのクリックが検出できなければどうにもなりません.

Windowsはメッセージの嵐です.WindowsというOS(Windowsとは限りませんが)は常にシステム
を監視していて,
[Ctrl]+[Alt]+[Delete]
を検出すると,タスクマネージャーを表示しているようになっています.

DelphiのボタンもWindowsのメッセージを監視していますが,自分のアプリ内だけです.
そうしないと,プログラムの開発者は,どこからそのメッセージからで,どんなメッセージ
かを判定する処理,つまりプログラムを書かなければなりません.
プログラマーに便利なような仕組みになっているわけです.

しかし,Delphiでは自アプリ以外のメッセージも処理できるようになっています.
それには主にフックというものを使用します.
(フックと用語は違いますが,似たような他の処理もあります)
フックは,Windowsのメッセージを横取りして処理することが可能です.
ただし,フックの処理はプログラムとしては難しい方でしょう.

今回の質問の内容は,実際の処理内容が不明(DelphiとOS等の環境も不明)なので
なんとも言えませんが,フックを使用するほどのことではないと推定します.
(フックの動作仕様はOSによって違う場合があります)

スレッドというのがレスにありますが,これに限らず,このような機会に調べる
というのもまたいいチャンスのような気もします.

フックもネットでいろいろ調べることができますが,手前味噌で紹介しておきます.

もちろん,どうしても

>あれをDosのBatとかで実行できないですかね???

ということをしたいのであれば,参考になるとは思いますが,わさわざ難しい
コーディングをする必要もないと思いますよ.

第4章 メッセージを盗む: サブクラス化とフック関数
http://mrxray.on.coocan.jp/Halbow/Chap04.html

第7章 ウィンドウメッセージを捕まえる : ローカルフック
http://mrxray.on.coocan.jp/Halbow/VCL07.html

フック関数のインスタンス化
http://mrxray.on.coocan.jp/Halbow/Notes/N006.html

フック関数の種類 
http://mrxray.on.coocan.jp/Others/A_KindOfHook.htm

260_グローバルフック(キー・マウス)
http://mrxray.on.coocan.jp/Delphi/plSamples/260_HookKeyMouseEvent.htm

270_ウインドウの生成を知る
http://mrxray.on.coocan.jp/Delphi/plSamples/270_HookCBTCreate.htm

280_アプリの起動と終了を知る
http://mrxray.on.coocan.jp/Delphi/plSamples/280_HookCBTActivate.htm

290_グローバルフックWH_GETMESSAGE
http://mrxray.on.coocan.jp/Delphi/plSamples/290_HookGetMessage.htm

300_グローバルフックWH_CALLWNDPROC
http://mrxray.on.coocan.jp/Delphi/plSamples/300_HookCallWndProc.htm

310_グローバルフックWH_CALLWNDPROCRET
http://mrxray.on.coocan.jp/Delphi/plSamples/310_HookCallWndProcRet.htm


Fusa  2009-11-30 02:36:48  No: 36327

内容がよくわからないのですが、

プロセスのexe名やフルパスexeやプロセスIDで
プロセスを落としたいのなら、コマンドを作っています。
http://delfusa.main.jp/delfusafloor/opensource/execontrol/20070709160841/index.html

ExeTerminate/ExeTerminateMultiのソースみてください。
他のユニットもusesする必要があるかもしれません。


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

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






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