QThead实现模拟VC工作线程函数
来源:互联网 发布:手机发布淘宝宝贝软件 编辑:程序博客网 时间:2024/05/22 05:57
// 刚了解QT,感觉QT的线程类QThread使用很不方便,多数情况下只是用到线程函数而已,而QT非得由QThread派生一个类来处理多线程,使用极为不方便,因此自己封装了一个类// 用来模拟VC中的工作线程函数,其中一些Windows线程特性QT好象不支持(线程挂起,唤醒,运行于某个核等等,因本人对QT也不太了解,不知道是不支持还是自己没找到方法),// 所以有几个函数暂未实现,如哪位朋友能实现,请告之,在此谢过。// 头文件#ifndef QTHREADBASE_H#define QTHREADBASE_H #include <iostream>#include <stdlib.h>#include <qmutex.h>#include <Qthread.h>#include <list> #ifdef _MAC#define CALLBACK PASCAL#define WINAPI CDECL#define WINAPIV CDECL#define APIENTRY WINAPI#define APIPRIVATE CDECL#ifdef _68K_#define PASCAL __pascal#else#define PASCAL#endif#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cdecl#define APIENTRY WINAPI#define APIPRIVATE __stdcall#define PASCAL __stdcall#else#define CALLBACK#define WINAPI#define WINAPIV#define APIENTRY WINAPI#define APIPRIVATE#define PASCAL pascal#endif class CThread: public QThread{public: CThread(); virtual ~CThread();public: // 设置等待超时 void SetTimOut(unsigned long dwTimeOut = ULONG_MAX); // 获取等待超时 unsigned long GetTimeOut(); // 允许线程强制退出 void EnableTerminateThread(bool bEnable = false); bool IsEnableTerminateThread(); // 线程退出标志 bool IsQuit(); // 设置线程退出标示 void SetQuit(bool bQuit); // 线程延迟 void ThreadSleep(unsigned long dwTime); // 启动线程 bool StartThread(void (WINAPI *ThreadFun)(void* pParam) ,Priority nPriority = NormalPriority,void* ThreadParam = NULL); // 设置线程权限 bool SetThreadPriority(Priority priority); // 恢复线程 unsigned long ResumeThread(); // 挂起线程 unsigned long SuspendThread(); // 设置线程与CPU某个核运行 unsigned long SetThreadAffinityMask(unsigned long dwThreadAffinityMask); // 等待线程退出 bool WaitQuit(unsigned long dwMilliseconds); // 强制杀掉线程 bool TerminateThread();public: void SetCustomData(void *lpData); void *GetCustomData();private: void run();private: void (WINAPI *FUN_ThreadFun)(void* pParam); void* m_lpThreadParam; unsigned long m_dwTimeOut; // 允许强行杀线程 bool m_bEnableForceKill; bool m_bAllowExit; // 自定用户参数 void *m_lpCustomData;}; #endif // QTHREADBASE_H
// cpp文件#include "Thread.h" CThread::CThread(){ m_dwTimeOut = ULONG_MAX; m_bEnableForceKill = false; SetQuit(false); m_lpCustomData = NULL;}CThread::~CThread(){ SetQuit(true); if(!IsEnableTerminateThread()) { if(!WaitQuit(m_dwTimeOut)) { TerminateThread(); } } else { TerminateThread(); }}void CThread::SetCustomData(void *lpData){ m_lpCustomData = lpData;} void *CThread::GetCustomData(){ return m_lpCustomData;} void CThread::run(){ if(FUN_ThreadFun) { FUN_ThreadFun(m_lpThreadParam); }} bool CThread::WaitQuit(unsigned long dwMilliseconds){ return wait(dwMilliseconds);}void CThread::EnableTerminateThread(bool bEnable){ m_bEnableForceKill = bEnable;}bool CThread::IsEnableTerminateThread(){ return m_bEnableForceKill;} void CThread::SetTimOut(unsigned long dwTimeOut){ m_dwTimeOut = dwTimeOut;}unsigned long CThread::GetTimeOut(){ return m_dwTimeOut;}bool CThread::IsQuit(){ return m_bAllowExit;}void CThread::SetQuit(bool bQuit){ m_bAllowExit = bQuit;}void CThread::ThreadSleep(unsigned long dwTime){ if( dwTime > 10) { unsigned int dwCount = 0; while(!IsQuit()) { QThread::msleep(10); if(++dwCount > (unsigned int)(dwTime / 10)) { break; } } } else { QThread::msleep(dwTime); }} // If the function succeeds, the return value is nonzero.unsigned long CThread::SetThreadAffinityMask(unsigned long dwThreadAffinityMask){// 暂未实现 return 0;}bool CThread::StartThread(void (WINAPI *ThreadFun)(void* pParam),Priority nPriority,void* ThreadParam){ FUN_ThreadFun = ThreadFun; m_lpThreadParam = ThreadParam; start(nPriority); return true;}//设置优先级为高于正常bool CThread::SetThreadPriority(Priority priority){ setPriority(priority); return false;}unsigned long CThread::ResumeThread(){// 暂未实现 return 0xFFFFFFFF;}unsigned long CThread::SuspendThread(){// 暂未实现 return 0xFFFFFFFF;} // 强制杀掉线程bool CThread::TerminateThread(){ terminate(); return true;}
//调用:static void WINAPI Thread_Fun(void* wParam);void CTest::Start(){ CThread *pThead = new CThread ; pThead ->SetCustomData(this); pThead ->SetTimOut(2000); pThead ->StartThread(Thread_Fun,CThread::NormalPriority,pThead );} void WINAPI CTest::Thread_Fun(void* wParam){ CThread *pThread = (CThread*)wParam; if(pThread) { CTest*pFrame = (CTest*)pThread->GetCustomData(); if(pFrame) { while(!pThread->IsQuit()) { // 处理指令函数 pThread->ThreadSleep(1); } } }}
0 0
- QThead实现模拟VC工作线程函数
- 用vc线程模拟实现并行算法
- [翻译]使用QThead进行线程开发&&线程同步
- VC模拟系统线程池
- VC++ 实现星图模拟
- VC ++ 利用系统函数 QueueUserWorkItem 实现线程例子
- VC ++ 利用系统函数 QueueUserWorkItem 实现线程例子
- 线程池模拟实现
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC实现线程池
- VC++ 实现线程注入
- 图解TCP/IP协议
- 第一周 项目三时间类(增加n秒)
- Matlab C/C++混合编程实例学习
- 数据链路层
- CSDN Markdown简明教程3-表格和公式
- QThead实现模拟VC工作线程函数
- mysql_ffetch_assoc()/mysql_ffetch_row()/mysql_ffetch_array() 比较
- 4个惨烈冤案背后的司法真相
- POJ 3067 Japan
- No enclosing instance of type E is accessible
- 操作系统对内存的管理
- Hadoop学习笔记(安装--中篇)
- 美国最牛钉子户面临拆除命运
- eclipse安装javascript插件