2013年2月18日 星期一

c++ Thread window win32

標題下的不怎麼樣

最近遇到在windows 系統下 建立thread 的問題

若是原始的c語言到是建立沒甚麼問題

簡單的 include 標頭檔


#include <process.h>


就可以簡簡單單的開啟

_beginthread()  
_beginthreadex()

這兩個system call 參數的話就請自行上網googel 



_beginthread() 的參數比較簡單 但其實問題很多

_beginthreadex() 參數比較多,其問題比較少,算是比較安全的thread 呼叫

可是我是懶人,所以是用_beginthread 下去寫XD


在c++裡面 規定static member 不可以呼叫 non-static member 

原因是因為其C++為物件導向, 這樣呼叫的話並不知道要叫哪一個物件的 non-static member 起來run

又或者物件根本沒有創出來  哪裡來的member 可以run

所以如果開啟thread 跑某個 C++ 的non-static member  怎麼辦呢

其實就只要告訴thread  你的物件是哪一個(就是指定物件的意思)

這樣子就可以跑囉,簡單來說就是這樣

所以不外乎是呼叫thread 時就把 物件的this 傳進去 ,或把物件的address 傳進去


這邊就丟了一些sample code  分別是由淺到深

網路上參考來的,沒試過能不能跑,但是只要吸收概念聰明的 programer 應該就會寫了

ex1.


#include <windows.h>

#include <process.h>

#include <iostream>
using namespace std;
void threadProc(void* p)
{
char *data = (char*)p;
cout << "Starting -- " << data << endl;
Sleep(3000);
cout << "Ending -- " << data << endl;
delete [] data;
}
int main()
{
char *Data1 = new char[99];
strcpy(Data1, "Testing 1");
_beginthread(threadProc, 0, (void*)Data1 );
char *Data2 = new char[99];
strcpy(Data2, "Testing 2");
_beginthread(threadProc, 0, (void*)Data2 );
Sleep(3000);
}





ex2.



class Class
{
public:
   void fun_1(void)
   {
      _beginthread( &Class::static_fun_2, 0, this );
   }
   void fun_2(void)
   {
      printf("hello");
   }
private:
   static void static_fun_2( void * args )
   {
      static_cast<Class*>(args)->fun_2();
   }

};

ex3.


#include <iostream>

#include <process.h>


class MyClass {
    private:
        void myThread();
        static void launchThread(void*);

    public:
        static void start(MyClass*);
};

void MyClass::myThread() {
    std::cout << "myThread started" << std::endl;
}

// static
void MyClass::start(MyClass* c) {
    _beginthread(&MyClass::launchThread, 0, c);
}

// static
void MyClass::launchThread(void* arg) {
MyClass* obj = static_cast<MyClass*>(arg);
obj->myThread();
}

int main() {
    MyClass cl = MyClass();

    MyClass::start(&cl);

// you should wait for the thread to end here in some way..
    system("pause");
    return 0;
}



最後稍微貼一下初處





在第三個連結裡 有說明_beginthreadex的使用 還蠻清楚的


另外還有 pthread



至於pthread 呢 這又是另外一個故事了


1 則留言:

有敘述錯誤或者是觀念有問題歡迎指正