ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

VC++でCWinThreadを使った場合のスレッド作成(永遠にスレッドが回る版)

2007-08-16 20:00:35 | Weblog

これでいいのかどうかわかんないけど、とにかく出来たのでメモメモ

参考にしたサイト
http://hp.vector.co.jp/authors/VA014436/prg_memo/windows/vctips/039.html


今、ダイアログはできていて、それにスレッドを足すことを考えます。
スレッドは、永遠に2秒(2000ミリ秒)おきに”スレットだよ”とでます。



■方法

方法は、
1.CWinThreadから継承されるクラス(ここではCTestThreadクラス)を
  つくり、Runに処理を書きます

2.スレッドを作成するメソッドをつくて、
   CRuntimeClass *pRuntime = RUNTIME_CLASS(CTestThread);
   pThread = (CTestThread *)pRuntime->CreateObject();
   pThread->CreateThread(0, 0, NULL);
  をする

3.削除するメソッドで
   pThread->Delete();
  する

ただ、複数あるケースがあるので、CPtrArrayにスレッドを入れたりします。




■手順

 手順は、こんなかんじ
1.CWinThreadから継承されるクラスをつくり、Runに処理を書く
  1-1.スレッド処理するクラスの作成
  1-2.そのクラスにRunメソッド追加

2および3.スレッドを作成するメソッドをつくって
  2-1.OKイベント、Cancelイベントをつくる
  2-2.ヘッダに記述
  2-3.OKイベント、Cancelイベントのソースを作成

では、以下詳細に。。




■スレッド処理するクラスの作成

スレッド処理するクラスを追加するため

クラスビューから関数追加

MFCのクラスを選んで

CWinThreadから継承したクラスを作ります

■そのクラスにRunメソッド追加
クラスビューで追加したクラスに

関数を追加

Run関数を追加

出来たクラスのRun関数に、処理を書く
int CTestThread::Run(void)
{
	while(1)
	{
		AfxMessageBox("すれっどだよ");
		Sleep(2000);
	}
	return 0;
}



■OKイベント、Cancelイベントをつくる
リソースビューでダイアログをだしたら、

OKと、キャンセルをクリック=すると、メソッドはできる

■ヘッダに記述
ダイアログのヘッダに
#include	"TestThread.h"
#include	"stdafx.h"

というかんじで、スレッドのヘッダーと、APtrArray用のstdafx.hをインクルード

下のpublicのメンバーに
	CPtrArray	pThList;

というかんじで、スレッドを保持しておく領域をもっておく。

■OKイベント、Cancelイベントのソースを作成
今回はOKで、どんどんスレッド作成、
キャンセルで終了とするので、こんなかんじになる。

void CThreadTestDlg::OnBnClickedOk()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。
	CTestThread *pThread; 

	CRuntimeClass *pRuntime = RUNTIME_CLASS(CTestThread);
    pThread = (CTestThread	*)pRuntime->CreateObject();
    pThread->CreateThread(0, 0, NULL);
	pThList.Add(pThread);
	//	OnOK();
}

void CThreadTestDlg::OnBnClickedCancel()
{
	// TODO : ここにコントロール通知ハンドラ コードを追加します。
	CTestThread *pThread; 

	for(int i = 0 ; i < pThList.GetSize() ; i ++ )
	{
		pThread	=	(CTestThread	*)pThList.ElementAt(i);
		pThread->Delete();
	}

	OnCancel();
}

(上記< > は本当は半角)




■ただし。。。

 今回は、無限ループで終わらないので、キャンセルで、全部DeleteしてOKだったけど、自動的に終わってしまう場合には、終わったものをDeleteするとまずいので、それらは、除く処理が必要になる。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 開発の初めから順番に書いて... | トップ | 履歴など過去のデータがテー... »
最新の画像もっと見る

Weblog」カテゴリの最新記事