これでいいのかどうかわかんないけど、とにかく出来たのでメモメモ
参考にしたサイト
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するとまずいので、それらは、除く処理が必要になる。