スレッド処理

ボタンを押して長い処理をすると、画面が固まります。

画面が止まらないように長い処理をする場合は、スレッド処理をしましょう。

ここでは、スレッド処理の方法を解説します。

関数を定義する

まず、スレッド処理用の関数を用意しておきます。

以下のようにしておきましょう。

UINT t_func(LPVOID pParam){
    CProgramView* pWorker=(CProgramView*)pParam;
    if(pWorker==NULL){
        return 0;
    }
    //処理
}

スレッドを行う場所が所属しているクラスのアドレスを通じて値を受け取ります。

ここでは、ボタンを押した際の部分が

void CProgramView::OnBnClickedButton(){
...
}

なので

CProgramView* pWorker=(CProgramView*)pParam;

としました。これにより、pWorker->とすればCProgramViewのメンバをスレッド関数内で使用出来ます。

スレッドを開始する

スレッドを開始するには

void CProgramView::OnBnClickedButton(){
    m_thread=AfxBeginThread(t_func,this);
}

とします。m_threadはOnBnClickedButton外で使用するので、CProgramViewに新しく変数を追加しておきましょう。クラスビューでCProgramViewを右クリックすれば変数を追加できます。変数を追加する際の変数の型は「CWinThread*」としてください。

スレッドを中断する

スレッドを中断する場合は、フラグを通じてスレッドとやりとりします。

例えば、

UINT t_func(LPVOID pParam){
    CProgramView* pWorker=(CProgramView*)pParam;
    if(pWorker==NULL){
        return 0;
    }
    while(true){
        if(pWorker->stop_flag)break;
    }
}

とすれば、stop_flagをtrueにすれば中断できます。stop_flagをCProgramViewの変数に追加しておきましょう(bool型)。

著者:安井 真人(やすい まさと)