_beginthread, _endthread

_beginthread, _endthread はこんな感じでとりあえずOKでした。

_beginthread() で boost::bind を使った関数コールもいろいろと試したのですが、うまくいきませんでした。
インターネットで検索もずいぶんしたのですが、うまい方法がヒットしません。boost::thread でできている以上、何かしら手があると思うのですが、今のところ良い方法が見つかりません。こちらについてはうまくいったらこちらの記述を更新したいと思います。

//
// test_BeginThread.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
// #include <windows.h>
#include <process.h>          // _beginthread, _endthread
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>                // std::string
#include <boost/bind.hpp> // boost::bind 

using namespace std;

void PrintHello( void* arglist )
{
    for ( size_t i=0; i<10; ++i ){
        Sleep(400);
        cout << "Hello." << endl << flush;
    }     _endthread();
}

void PrintWorld( void* arglist )
{
    for ( size_t i=0; i<10; ++i ){
        Sleep(500);
        cout << "World." << endl << flush;
    } 
    _endthread();
} 

void PrintString( void* arglist )
{
    char* pString = (char*)arglist ; 
    for ( size_t i=0; i<10; ++i ){
        Sleep(500);
        cout << pString << endl << flush;
    } 
    _endthread();
} 

class Printer
{
private:
    string strMessage_ ;

public:
    Printer( string strMessage ) : strMessage_(strMessage)
    {
    }
 
    static void run( void* arglist )
    {
        reinterpret_cast<Printer*>(arglist)->print();
        _endthread();
    } 

    void print()
    {
        for ( size_t i=0; i<10; ++i ){
            Sleep(500);
            cout << strMessage_ << endl;
        }
    }
};


int main(int argc, char* argv[])
{
    // 引数なし のスレッド起動
    {
        HANDLE hThread[2] ;

        // スレッド起動
        cout << "[メソッド のスレッド起動] 開始" << endl;
        hThread[0] = (HANDLE)_beginthread( PrintHello, 0, NULL );
        hThread[1] = (HANDLE)_beginthread( PrintWorld, 0, NULL ); 

        // スレッド終了待ち
        DWORD dwRet ;
        dwRet = WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );

        switch( dwRet ){
        case WAIT_OBJECT_0:
            cout << "[引数なし のスレッド起動] 全スレッドを終了完了" << endl;
            break ;
        case WAIT_TIMEOUT:
            cout << "スレッド終了待ちでタイムアウトが発生しました。" << endl;
            break ;
        default:
            cout << "スレッド終了に失敗しました。" << endl;
            break ;
        }
    } 

    // 引数あり のスレッド起動
    {
        HANDLE hThread[2] ;
        char sHello[] = "Hello ";
        char sWorld[] = "World "; 

        // スレッド起動
        cout << "[引数あり のスレッド起動] 開始" << endl;
        hThread[0] = (HANDLE)_beginthread( PrintString, 0, (void*)sHello );
        hThread[1] = (HANDLE)_beginthread( PrintString, 0, (void*)sWorld ); 

        // スレッド終了待ち
        DWORD dwRet ;
        dwRet = WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );

        switch( dwRet ){
        case WAIT_OBJECT_0:
            cout << "[引数あり のスレッド起動] 全スレッドを終了完了" << endl;
            break ;
        case WAIT_TIMEOUT:
            cout << "スレッド終了待ちでタイムアウトが発生しました。" << endl;
            break ;
        default:
            cout << "スレッド終了に失敗しました。" << endl;
            break ;
        }
    } 
    // メソッド のスレッド起動
    {
        HANDLE hThread[2] ; 
        Printer cpr1("Printer.");
        Printer cpr2("Run method directly."); 

        // スレッド起動
        cout << "[メソッド のスレッド起動] 開始" << endl;
        hThread[0] = (HANDLE)_beginthread( &Printer::run, 0, (void*)&cpr1 );
//     hThread[1] = (HANDLE)_beginthread( &Printer::print, 0, (void*)&cpr2 ); 

        // スレッド終了待ち
        DWORD dwRet ;
        dwRet = WaitForMultipleObjects( 1, hThread, TRUE, INFINITE );

        switch( dwRet ){
        case WAIT_OBJECT_0:
            cout << "[メソッド のスレッド起動] 全スレッドを終了完了" << endl;
            break ;
        case WAIT_TIMEOUT:
            cout << "スレッド終了待ちでタイムアウトが発生しました。" << endl;
            break ;
        default:
            cout << "スレッド終了に失敗しました。" << endl;
            break ;
        }
    } 

    // 後処理
    return EXIT_SUCCESS ;
}

 


記載: 2010年3月14日 木下英俊