必須テクニック 新たなプログラムを実行するためにタスクマネージャーから現在実行中のexeファイルを停止する方法を学んでみよう

ソーラー「ところでみんな


while{}文やfor{}文


を使ったプログラムを実行する場合には


注意する点があります


while{}文やfor{}文


を使ったプログラムを実行して


プログラムを


終了したとおもっても


実はみえないところで

(バックグラウンドで)

プログラムが


実行されている場合があります


とくに


            🍊while{}文やfor{}文で🍊


 🍊無限にブロック{}内の命令文が実行されるようなプログラムを実行した場合🍊


プログラムを終了したと思っても


実はみえないところで

(バックグラウンドで)

プログラムが


実行されている場合が多々あります


Visual Studioでは一度に1つのプログラムしか


実行できないので


みえないところで

(バックグラウンドで)

プログラムが


実行されている場合


あらたなプログラムを実行しようとしても


実行することはできません


あらたなプログラムを実行しようとすると


以下のようなエラーが表示されることになります

👇

https://solalion.blogspot.com/2021/08/blog-post_1.html


👆


この画面では


エラー LNK1168


ファイル C:\Users\solar\source\repos\game\Debug\game.exe を開いて書き込むことができません。


が表示されているね




ですので


あらたなプログラムを実行するには


なんとしても


実はみえないところで

(バックグラウンドで)

実行されているプログラムを終了する必要があります」


solarplexuss「


プログラムを


終了したとおもっても


実はみえないところで

(バックグラウンドで)

プログラムが


実行されている場合があるんだ!


でも


みえないところで実行されているプログラムなんて


どうやって終了させるの?」


ソーラー「そのとき頼りになるのが


WindowsOSに搭載されている


タスクマネージャー


という機能なんです


タスクマネージャー


という機能


を使えば



実行されているすべてのプログラムを参照することができ

(もちろん みえないところで実行されているプログラムもです)

なおかつ


その中から


実行されているプログラムを選んで


終了させる(停止させる)ことができるんだよ」


マックス「WindowsOSにはそんな便利な機能があるのか?」


ソーラー「そうなんです


試しに


タスクマネージャーの機能


を使って



実行されているプログラムを


終了させてみない?(*´▽`*)」


マックス「そのためには


まず第一に

  

プログラムが実行されている状態を


つくりださないといけないんじゃないか?


どうやってその状態つくりだすかだが・・・」


solarplexuss「んもう


そんなの


簡単じゃない


いままでさんざんやってきたよね


って・・・


・・・どうやるの?」


ソーラー「ええ?


みんなもうわかってるんじゃないの?


プログラムが実行されている状態を


つくるのはとっても簡単です




では


まず


プログラムが実行されている状態をつくりだして


そののち


そのプログラムを


タスクマネージャーの機能を


使って終了(停止)させてみましょう



そうですね


プログラムの実行が


され続けている状態をつくりだすには・・・・・


プログラムに


WaitKey()関数を用いて


なにか


キーが押されるまで


WaitKey()関数より以下の命令文が実行されないようにするのも


いい方法ですね


プログラムを実行したとき


何もキーを押さない場合


WaitKey()関数より以下の命令文は実行されないことになります


この場合


ゲーム画面上で何も変化は起きませんが


ゲーム画面上で何も変化が起きていなくても


プログラムは実行されつづけています



もしくは別の方法として


while{}文やfor{}文を


プログラムに組み込んで


ずっと無限に


while{}文やfor{}文の


ブロック{}内の命令文が実行されるようにするのも


いい方法ですね


この場合でも


プログラムを実行したとき


ゲーム画面上で何も変化が起きていなくても


プログラムは実行されつづけています



今回は


while{}文やfor{}文を


プログラムに組み込んで


ずっと無限に


while{}文やfor{}文の


ブロック{}内の命令文が実行されるようにしてみよっかな~😊


そのプログラムはこちらです

👇


#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


int x = 0;


int y = 0;



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


マックス「なんだ


もう


おなじみの&演算子を用いたプログラムだな


もう親しみをかんじてきたぞ」


ソーラー「


このプログラムを


終了するには


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0)



条件式が


CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0


となっているため


エスケープキーを押すことになります


🍅エスケープキーを押すと🍅


CheckHitKey(KEY_INPUT_ESCAPE) に戻り値として1が返されることになるので


条件式


CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0



1==0&&ProcessMessage() == 0


イコール


0&&ProcessMessage() == 0

(論理式1==0は偽の値0をもちます)


となります


OSシステムが順調に稼働していて


ProcessMessage()が実行されたとき


ProcessMessage()に戻り値として0が返されたなら


0&&ProcessMessage() == 0


0&&0 == 0


イコール


0&&1

(論理式0==0は真の値1をもちます)

となります


条件式

0&&1



偽の値0をもつことになり


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0)



while (0)



while ()の()内の 条件式が


0となるので


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) に


つづくブロック{}内の命令文は実行されなくなります


つまり


無限ループの繰り返し実行が終了することになります



あとは


DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します


が実行されて


プログラム自体が終了することになります」



マックス「おお・・・やったな


・・・って


プログラムが実行され続けている状態をつくりだすのだから


プログラムを終了する方法を紹介したらダメなんじゃないか?」


ソーラー「あっ


そうだった


ということは逆にいえば


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0)



while ()の()内の条件式


CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0



0にならない限り


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) に


つづくブロック{}内の命令文はずっと繰り返し実行されつづけることになるね




つまり


ProcessMessage()に戻り値として0が返り続けている状態で


エスケープキーを押さない場合


CheckHitKey(KEY_INPUT_ESCAPE)が実行されると


CheckHitKey(KEY_INPUT_ESCAPE)には


戻り値として常に0が返るので



while ()の()内の条件式


CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0



0==0&&0==0

(論理式0==0は真の値1をもちます)

イコール

1&&1


となり


条件式

1&&1


真の値1を持つので


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0)

while (1)


となるので


while{}文

👇


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};

👆

の{}内の命令文

👇

DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();



高速で繰り返し繰り返し無限に実行されることになります」


solarplexuss「もしかして・・・


エスケープキーを押さない限り


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();



高速で繰り返し繰り返し無限に実行されるんだけど


エスケープキーを押していない状態で


さらに


十字キーのどの方向のキーも


押していない場合


飛行機はとまったまま静止しているようにみえるでしょ


その場合でも


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();



高速で繰り返し繰り返し無限に実行されているってことになるんじゃ・・・」


ソーラー「そうなんです


何のボタンも押していなくて


ずっと静かに


飛行機が同じ位置からうごかず


ゲーム画面に表示されているようにみえても


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();



高速で繰り返し繰り返し無限に実行されつづけています




具体的には



DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


によって


青い四角形が描かれ


次に


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行されます


何も十字キーを押さなければ飛行機が移動することはありません


次に

(あらかじめ


SetDrawScreen(DX_SCREEN_BACK);


を実行しておいたので)


DrawGraph(x,y,graphichandle, TRUE);


の実行により


飛行機の画像が裏画面に描かれます


次に

ScreenFlip();


の実行により


ある一定の時間


裏画面に描かれた飛行機の画像が表画面(ゲーム画面)


にも描かれることになります


そして


ClearDrawScreen();


の実行によって


表画面

裏画面


両方の画面に表示されている


飛行機の画像が消去されます



再び


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


によって


青い四角形が描かれ


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行されます


何も十字キーを押さなければ飛行機が移動することはありません


次に


(あらかじめ


SetDrawScreen(DX_SCREEN_BACK);


を実行しておいたので)


DrawGraph(x,y,graphichandle, TRUE);


の実行により


飛行機の画像が裏画面に描かれます


次に

ScreenFlip();


の実行により


ある一定の時間


裏画面に描かれた飛行機の画像が表画面(ゲーム画面)


にも描かれることになります


そして


ClearDrawScreen();


の実行によって


表画面

裏画面


両方の画面に表示されている


飛行機の画像が消去されます


以下同じ事の繰り返し




solarplexuss「うわあ


じゃあ


ゲーム画面に


ただ飛行機が表示されているだけでも


コンピュータは計算をずっと行っているんだね」


ソーラー「そうなんです


そう


以下のプログラムを実行して

👇


#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


int x = 0;


int y = 0;



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです

👇

https://solalion.blogspot.com/2021/08/blog-post_94.html



👆


この図のように


十字キーを押さず


飛行機がじっと表示されているだけでも


プログラムは高速で実行され続けています


(プロジェクト名がgameなので


実行されているプログラムの名前はgame.exeとなります)


さてさてプログラムが実行され続けている状態をつくりだしたところで


いよいよ本題だね



このとき


ディスプレイ画面の左下の


4つの四角からなるwindowsマークにカーソルをあわせて


          💖右クリックします💖


そして


表示されるメニュー画面から


タスクマネージャー



選択クリックします


すると


以下のような画面が表示されます


👇

https://solalion.blogspot.com/2021/09/blog-post.html

(画面をクリックすると拡大表示されます)

👆


これが


タスクマネージャーという


プログラムの実行を管理する画面です


今 現在実行されているプログラムの


CPUの使用率



メモリの使用率などが表示されていますね(*´▽`*)」


solarplexuss「へえ いろんなプログラムが実行されているんだね」



マックス「何か・・・


CPUの使用率



メモリの使用率


の数値が微妙に変化していないか?」


ソーラー「それは


まさに


色々なプログラムが


           リアルタイムで 今


実行されているからなんです


瞬間 瞬間で


そのプログラムの実行における


CPUの使用率



メモリの使用率は


変わってくるんだ


ところで


実行されているプログラムの一覧の一番上に

👇

https://solalion.blogspot.com/2021/09/blog-post_2.html

(画面をクリックすると拡大表示されます)

👆


game(32ビット)


と表示されているのがおわかりになられますか?


これが


今 実行されているgame.exeプログラムなんです

(必ずしも一番上に表示されるわけではありません)


マックス「ほう



ゲーム画面に


飛行機がじっと


表示されているだけだが


やはり


game.exeプログラムは実行中というわけだ」


ソーラー「Visual Studioでは一度に1つのプログラムしか実行できないので


新たなプログラムを実行しようと思っても


この


game.exeプログラムが実行されている限り実行することはできません


この


タスクマネージャーの


プログラムの実行を管理する画面から


game.exeプログラムを終了させてみたいと思います


game(32ビット)



右クリックし


表示されるメニュー一覧から


タスクの終了をクリックします


すると


game.exeプログラムは終了し



タスクマネージャーの


プログラムの実行を管理する画面から


game.exeプログラムは消去されることになります


逆にいうと


タスクマネージャーの


プログラムの実行を管理する画面に


game(32ビット)が表示されていなければ


game.exeプログラムは実行されていません


これで


Visual Studioで


新たにプログラムを作成し


デバッグなしで実行をおこなうことにより


生成される新たな


game.exeプログラムを


実行することができるようになります


(ちょっとしたポイントですが


gameというプロジェクト内で生成されるexeファイルは


すべて


game.exe


という名前の実行ファイルになります


そして


以前作った


game.exeプログラムは


新たに作った


game.exeプログラムによって上書きされることになります)








ですから


もし


みえないところで

(バックグラウンドで)

game.exeプログラムが


実行されていて


あらたなgame.exeプログラムが実行できないという状態に陥った場合は


タスクマネージャーの


プログラムの実行を管理する画面から


みえないところで

(バックグラウンドで)


実行されているgame.exeプログラムを消去すれば


あらたなgame.exeプログラムを実行できることになります


パソコンを再起動をしても


みえないところで

(バックグラウンドで)


実行されているgame.exeプログラムを消去して


あらたなgame.exeプログラムを実行することができるようになりますが


あらたなgame.exeプログラムを実行する度に


パソコンを再起動をするのは


ちょっと手間かな


タスクマネージャーの


プログラムの実行を管理する画面から



みえないところで

(バックグラウンドで)


実行されているgame.exeプログラムを消去するのが


はるかに楽で簡単です」


solarplexuss「便利な方法だね


あらたなgame.exeプログラムを作成しても


パソコンを再起動しないと実行できないんじゃ


ゲーム作りをスムーズに続けることができなくなっちゃうからね」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る