標籤:c++多線程 多線程編程 封裝 beginproce
在C++的多線程編程實現裡有兩種方式,一種是Windows標頭檔裡的CreateProcess,另一種是process.h裡的_beginthread,我這裡用的是後一種,並且將多線程操作封裝成了類似Java裡的Thread類。
Thread類包含四種操作(對應線程的幾種狀態):就緒(start),掛起(suspend)、恢複(resume)以及終止(terminate),另外,還包含了一個可以設定線程逾時的操作。
Thread類代碼如下(Thread.h):
#ifndef THREAD_H#define THREAD_H#include <windows.h>#include <process.h>typedef void *HANDLE;class Thread{public: Thread(); //構造器 void start(); //線程啟動函數 virtual void run(); //線程運行函數 int suspend(); //線程掛起,返回之前掛起次數 int resume(); //線程恢複,返回之前的掛起次數 void terminate(); //強行終止進程 void setTimeOut(DWORD time); //設定逾時時間,預設為INFINITE DWORD getTimeOut(); //返回逾時時間private: HANDLE m_h; //當前線程的控制代碼 DWORD m_timeout; //逾時時間 static void init(void *_h); //運行當前線程};#endif
實現檔案(Thread.cpp):
#include <iostream>using std::cin;using std::cout;using std::endl;#include "Thread.h"Thread::Thread(){ m_timeout = INFINITE; //設定預設的逾時,為無窮大}void Thread::start(){ m_h = (HANDLE)_beginthread(init, 0, (void *)this); //建立線程}void Thread::run(){ //線程運行方法}void Thread::init(void* _h){ Thread *t = (Thread*)_h; t->run(); DWORD dw = WaitForSingleObject(t->m_h, t->m_timeout); //等待線程,500ms後逾時結束,INFINITE表示不逾時 switch (dw) { case WAIT_OBJECT_0: break; case WAIT_TIMEOUT: cout << "Time Out" << endl; break; case WAIT_FAILED: break; }}//線程掛起,返回之前掛起次數int Thread::suspend(){ return SuspendThread(this->m_h);}//線程恢複,返回之前的掛起次數int Thread::resume(){ DWORD re = ResumeThread(this->m_h); return re;}//強行終止進程void Thread::terminate(){ TerminateThread(this->m_h, EXIT_SUCCESS);}//設定逾時時間,預設為INFINITEvoid Thread::setTimeOut(DWORD time){ this->m_timeout = time;}//返回逾時時間DWORD Thread::getTimeOut(){ return this->m_timeout;}
測試檔案(TestThread.cpp):
//測試檔案#include "Thread.h"#include <windows.h>#include <process.h>#include <iostream>using std::cin;using std::cout;using std::endl;#include <string>using std::string;class TestThread : public Thread{public: TestThread(string _s){ s = _s; } string s; void run();};void TestThread::run(){ for (int i = 0; i < 10; i++){ cout <<s+"\n"; }}int main(int argc, char *argv[]){ TestThread *dt[10]; dt[0] = new TestThread("A"); //建立線程A dt[1] = new TestThread("B"); //建立線程B dt[0]->start(); //開啟線程A cout<<dt[0]->suspend()<<endl; //掛起線程A dt[1]->setTimeOut(500); dt[1]->start(); //開啟線程B Sleep(2000); //暫停2s,此時線程A仍屬於掛起狀態,所以不執行 dt[0]->resume(); //恢複線程A,此時線程A屬於恢複狀態,繼續執行 getchar();}
測試結果
【C++編程】C++實現多線程編程