第36講 複数のソフトをナビゲーションソフトから起動する(マルチスレッド研究)☆☆
第6話 インクルードと
using namespace System::Threading;の意味
第6話では
#pragma once
#include"stdafx.h"
#include "Form2.h"
#include "Form3.h"
#include "Form4.h"
#include "Form5.h"

namespace スレッドの起動 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Threading;
ピンクの意味を説明します。
#includeはインクルード=外部から呼びだして一つにまとめるです。
読み込むファイルの種類によって
#include<・>
#include"・"
と書き分けます。

<>と""のく別は、自分で作ったファイルが""で、mathやstdioのような標準ヘッダが<>です。
""が自作のヘッダで、標準ヘッダはVC++標準で用意されているヘッダファイルです。
#include"stdafx.h"stdafx.hは作った覚えがないとお思いになると思いますが、
これは新しいプロジェクト=ソリューションを作るときに自動的に作れられていますので、
結局は、プロジェクト名=ソリューション名を作った人が自作しています。
実際、ソリューションエクスプローラーで見ると、
c++作った覚えのないヘッダファイル(拡張子がhのファイル、拡張子とは*.*の.以降の部分)
存在しています。
それをダブルクリックしてみてみると
--------------------------------------
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
--------------------------------------
と内容は何もありません。
内容は、プロジェクトを立ち上げたあなたが作っていくのです。
ここには、5つのFormで共通に使う変数や関数を入れておきます。
各Formでグローバル変数を定義しても、
その変数が使える範囲は、グローバルであってもそのForm内だけです。
関数についても同様です。
Form間=ソフト間を超えて使いたい変数や関数は、 stdafx.hに記述します。
#include "Form2.h"
#include "Form3.h"
#include "Form4.h"
#include "Form5.h"

のForm2.hからForm5.hは間違いなく自分で作ったファイルです。
『えっ、どこで?』ですって。
第3話 新たなスレッドから新しいソフトを起動する方法において、
ヘッダファイルを右クリックして、追加→新しい項目でWindowsフォームからFrom2などを作りました。
でも作ったのは、Form2であって、Form2.hではないという疑問がありますか。
ヘッダファイルですから、Form2の名前を付けて追加すると、自動的に.hがつくのです。
実は、ワードの文書なども『学芸会の案内』などとファイル名を付けて保存すると、
自動的にファイル名は、『学芸会の案内.docx』などとなります。
拡張子は、ファイルの種類を示すものです。
ヘッダファイルは*.h、ソースファイルは*.cppです。
ワード文書でも2003なら、*.docです。

さて、なぜForm2.hなどのヘッダファイルをインクルードしなければならないのでしょうか。
それは、
        static void f1(){
           Application::Run(gcnew Form2());
        }
        static void f2(){
           Application::Run(gcnew Form3());
        }
        static void f3(){
           Application::Run(gcnew Form4());
        }
        static void f4(){
           Application::Run(gcnew Form5());
        }
に理由があります。もし、
#include "Form2.h"
#include "Form3.h"
#include "Form4.h"
#include "Form5.h"

を削ってビルドすると

エラー 1 error C2061: 構文エラー : 識別子 'Form2' c:\vc++2010\d3\スレッドの起動\スレッドの起動\Form1.h 139
エラー 2 error C2061: 構文エラー : 識別子 'Form3' c:\vc++2010\d3\スレッドの起動\スレッドの起動\Form1.h 142
エラー 3 error C2061: 構文エラー : 識別子 'Form4' c:\vc++2010\d3\スレッドの起動\スレッドの起動\Form1.h 145
エラー 4 error C2061: 構文エラー : 識別子 'Form5' c:\vc++2010\d3\スレッドの起動\スレッドの起動\Form1.h 148

とエラー表示が出てしまいます。Form2.hのファイルなどを開くなどの命令を実行しようとしましたが、Form2.hなどがなかったということです。
先にも書きました。
Formの命令は、そのForm内でしか有効ではありません。
Form間を超え、命令を実行するためには、
インクルード=外部から読み込んで一つにまとめておく、必要があるのです。

ならば、使っていないstdafx.hに記述しておいて、stdafx.hのみをインクルードすればよいのでは?
--------------------------------------
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once
#include "Form2.h"
#include "Form3.h"
#include "Form4.h"
#include "Form5.h"

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
--------------------------------------
その通りです。それでもビルドは成功します。

ですから皆さんが考えた方法を採用します。
Form1.hのコード
#pragma once
#include"stdafx.h"
namespace スレッドの起動 {
       ・
       ・
       ・
stdafx.hのコード
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once
#include "Form2.h"
#include "Form3.h"
#include "Form4.h"
#include "Form5.h"

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。


最後、
    using namespace System::Threading;
の意味を説明します。
マルチスレッドにするときは、この1行入れておく必要がある、
ということです。
というか、私にはそれしかわかりません。
とにかく、マルチスレッドプログラミングを組みときには、必要な1行だと覚えていただければと思います。

さて、第3話のコードの解説はこれで終わりです。
次話以降では、各ソフトに内容を実装(実際に内容を装備する=内容を入れる です。実装という言葉を覚えてください)していきます。
実装するに当たって△の講も読んでいないと理解できませんので、
☆☆のマークは第6話まで付けられていて、
第7話以降からは、△であると了解してください。
一度作ったソフトを再び最初から作るのは、
復習にはなりますが、
手間がかかりますので、今回はコピペを使って効率的に作ってみたいと思います。
ただし、円周率計算ソフトは作っていませんのでこれは最初から作りたいと思います。


第5話へ 第7話へ


戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)