MFCスタートとオフスレッド
2849 ワード
http://hi.baidu.com/andywangcn/item/50d640c325290a2aef4665c4
1、
起動スレッド:
CWinThread*AfxBegintinThread(スレッド関数、this)
2、通常スレッドの終了につながる2つの状況は、制御関数が終了するか、またはスレッドの実行が完了しないかです.ワードプロセッサがバックグラウンド印刷スレッドを使用すると、印刷が完了すると、制御関数は正常に終了します.しかし、ユーザが印刷をキャンセルすると、バックグラウンドの印刷スレッドは事前に終了しなければならない.このテーマは、各状況をどのように実現するか、また終了後にスレッドの終了コードを取得するかを紹介します.
(1)正常スレッド終了
補助スレッドについては、通常スレッドが終了するのは簡単である.制御関数を終了し、終了要因を示す値を返す.関数またはreturn文が使用できます.普通、0は成功したという意味ですが、これはあなた自身によるものです.
ユーザインターフェーススレッドについては、このプロセスも簡単である.ユーザインターフェーススレッド内からPlatform SDKを呼び出す.PostQuit Messageで採用されている唯一のパラメータはスレッドの終了コードです.補助スレッドについては、0は通常成功完了を表している.
(2)早期スレッド終了
早期終了スレッドはほぼ同じ簡単です.スレッド内から呼び出します.必要な終了コードを一意のパラメータとして転送します.これは、スレッドの実行を停止し、スレッドスタックの割り当てを解除し、スレッドに付加された全てのDLLを分離し、メモリからスレッドオブジェクトを削除する.
終了するスレッドからAfxEnd Threadを呼び出す必要があります.他のスレッドからスレッドを終了するには、2つのスレッド間の通信方法を設定する必要があります.
一例を挙げます
信号量はWaitForSingleObject関数で検出できます.
メンバー変数m_h ThreadEvent;
m_hThreadEvent=CreateEvent(NULL、FALSE、FALSE、NULL);
スレッドの実行関数:
for(;)
{ DWORD dwRetVal
dwRetVal=WaitForSingleObject(muhThreadEvent、100)
if(dwRetVal==WAIT TIMEOUT)
{ //TODO:
}
else
{
//stop receive text thread.
DWORD dwExitCode;
GetExit CodeThread(muplayreadRecv->muhThread&dwExitCode);
AfxEnd Thread(dwExitCode、TRUE);
}
}
スレッドを終了するときは、SetEventを使用して信号量を有信号にします.
このスレッドは信号量が信号量があるときに終了します.
(3)Terminate Thread
CWinThreadオブジェクトにはスレッドのハンドルがあり、このハンドルを使ってスレッドを強制的に殺すことができますが、このような方法は勧められません.正常に終了する場合は、前の2つの方法を選んだほうがいいです.
スレッドの終了コードを検索します.
補助スレッドまたはユーザーインターフェーススレッドの終了コードを取得するには、関数を呼び出します.この関数に関する情報は、Platform SDKを参照してください.この関数は、スレッド(CWinThreadオブジェクトに格納されているもの)を取得します.
スレッドがアクティブである場合、GetExit CodeThreadは提供されたDWORDアドレスにSTILLUACTIVEを置いています.そうでなければ、脱退コードをこのアドレスに置いておきます.
検索対象の終了コードにはまだステップが必要です.デフォルトでは、CWinThreadスレッドが終了すると、スレッドオブジェクトを削除します.これはアクセスできないことを意味します.将 はスレッドのハンドルを単独に記憶します.スレッドを作成したら、それを いずれの方法でもCWinThreadオブジェクトが終了した理由を確認できます.
1、
起動スレッド:
CWinThread*AfxBegintinThread(スレッド関数、this)
2、通常スレッドの終了につながる2つの状況は、制御関数が終了するか、またはスレッドの実行が完了しないかです.ワードプロセッサがバックグラウンド印刷スレッドを使用すると、印刷が完了すると、制御関数は正常に終了します.しかし、ユーザが印刷をキャンセルすると、バックグラウンドの印刷スレッドは事前に終了しなければならない.このテーマは、各状況をどのように実現するか、また終了後にスレッドの終了コードを取得するかを紹介します.
(1)正常スレッド終了
補助スレッドについては、通常スレッドが終了するのは簡単である.制御関数を終了し、終了要因を示す値を返す.関数またはreturn文が使用できます.普通、0は成功したという意味ですが、これはあなた自身によるものです.
ユーザインターフェーススレッドについては、このプロセスも簡単である.ユーザインターフェーススレッド内からPlatform SDKを呼び出す.PostQuit Messageで採用されている唯一のパラメータはスレッドの終了コードです.補助スレッドについては、0は通常成功完了を表している.
(2)早期スレッド終了
早期終了スレッドはほぼ同じ簡単です.スレッド内から呼び出します.必要な終了コードを一意のパラメータとして転送します.これは、スレッドの実行を停止し、スレッドスタックの割り当てを解除し、スレッドに付加された全てのDLLを分離し、メモリからスレッドオブジェクトを削除する.
終了するスレッドからAfxEnd Threadを呼び出す必要があります.他のスレッドからスレッドを終了するには、2つのスレッド間の通信方法を設定する必要があります.
一例を挙げます
信号量はWaitForSingleObject関数で検出できます.
メンバー変数m_h ThreadEvent;
m_hThreadEvent=CreateEvent(NULL、FALSE、FALSE、NULL);
スレッドの実行関数:
for(;)
{ DWORD dwRetVal
dwRetVal=WaitForSingleObject(muhThreadEvent、100)
if(dwRetVal==WAIT TIMEOUT)
{ //TODO:
}
else
{
//stop receive text thread.
DWORD dwExitCode;
GetExit CodeThread(muplayreadRecv->muhThread&dwExitCode);
AfxEnd Thread(dwExitCode、TRUE);
}
}
スレッドを終了するときは、SetEventを使用して信号量を有信号にします.
このスレッドは信号量が信号量があるときに終了します.
(3)Terminate Thread
CWinThreadオブジェクトにはスレッドのハンドルがあり、このハンドルを使ってスレッドを強制的に殺すことができますが、このような方法は勧められません.正常に終了する場合は、前の2つの方法を選んだほうがいいです.
スレッドの終了コードを検索します.
補助スレッドまたはユーザーインターフェーススレッドの終了コードを取得するには、関数を呼び出します.この関数に関する情報は、Platform SDKを参照してください.この関数は、スレッド(CWinThreadオブジェクトに格納されているもの)を取得します.
m_hThread
データメンバー中)のハンドルとDWORDのアドレスです.スレッドがアクティブである場合、GetExit CodeThreadは提供されたDWORDアドレスにSTILLUACTIVEを置いています.そうでなければ、脱退コードをこのアドレスに置いておきます.
検索対象の終了コードにはまだステップが必要です.デフォルトでは、CWinThreadスレッドが終了すると、スレッドオブジェクトを削除します.これはアクセスできないことを意味します.
m_hThread
データメンバーは、CWinThreadオブジェクトが存在しないため、このようなことがないようにするには、次のいずれかを実行してください.m_bAutoDelete
データのメンバーはFALSEに設定されています.これにより、CWinThreadオブジェクトはスレッド終了後も存在します.スレッド終了後もアクセスできます. m_hThread
データのメンバーです.しかし、この方法を使うと、オブジェクトは自動的に削除されませんので、CWinThreadオブジェクトを廃棄します.これは優先方法です.m_hThread
データのメンバーは他の変数にコピーして、この変数を通じてメンバーにアクセスします.これで終了後も自動的にオブジェクトを削除し、スレッド終了の原因が分かります.ハンドルをコピーできる前にスレッドが終了しません.この操作を実行する最も安全な方法は、CREATEuSUSPENDEDを転送し、ハンドルを保存してから、実行ラインを呼び出してください.