// 头文件
#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);
      }
    }
  }
}

QThead实现模拟VC线程函数的更多相关文章

  1. VC++线程函数内怎么调用外部函数

    VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.

  2. 老版VC++线程池

    在一般的设计中,当需要一个线程时,就创建一个,但是当线程过多时可能会影响系统的整体效率,这个性能的下降主要体现在:当线程过多时在线程间来回切换需要花费时间,而频繁的创建和销毁线程也需要花费额外的机器指 ...

  3. VC线程同步方法

    VC MFC中线程同步对象的区别 临界区 CCriticalSection,在用户模式工作,适用于保护线程间共享资源,一个线程可以多次Lock不会出错.不支持在多进程之间工作.互斥量 CM ...

  4. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  5. VC++ 线程同步 总结

    注:所谓同步,并不是多个线程一起同时执行,而是他们协同步调,按预定的先后次序执行. 与线程相关的基本函数包括:CreateThread:创建线程CloseHandle:关闭线程句柄.注意,这只会使指定 ...

  6. 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

    在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...

  7. CreateThread线程函数

    之前在一篇 基于TCP套接字实现的简单Demo   一文中用到了线程函数CreateThread()函数来 创建新的线程.下面以一个最简单的多线程例子来说明. C-代码如下: //最简单的创建多线程实 ...

  8. C语言::模拟实现strlen函数

    题目要求 编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0 ...

  9. 【C语言】模拟实现atoi函数

    atoi(表示 ascii to integer)是把字符串转换成整型数的一个函数. atoi()函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( ...

  10. CreateThread给线程函数传递的参数

      HANDLE WINAPI CreateThread ( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECURITY_ATTR ...

随机推荐

  1. torch& tensorflow

    #torchimport torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def _ ...

  2. 【TensorFlow】Tensorflow-GPU 环境搭建教程(附 Windows 版本对应表及 CUDA GPU 计算能力表)

    conda教程(推荐):『Tensorflow GPU Installation Made Easy: Use conda instead of pip [Update-2] | by Harveen ...

  3. matlab求解器的选择

    可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45:没有状态的系统用的是discrete. 1)od ...

  4. sdp安装及实例

    环境: sdpserver:192.168.1.160 sdpclient:192.168.1.161 安装 yum install gcc gcc-c++ libpcap* libtool* wge ...

  5. maven 通用pom.xml

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http:// ...

  6. 怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n)

    怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n) 前言:重在记录,可能出错. 超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n),也就是: 到底要怎么 ...

  7. 测试elasticsearch保存时报找不到类型的错误

    java测试存储数据到es时报错:...ActionRequestValidationException: Validation Failed: 1: type is missing... /** * ...

  8. python如何实现对word内段落文本及表格的读取

    在以下方法中用到的三方库是:python-docx from docx import Document 获取指定段落的文本 def get_paragraph_text(path, n): " ...

  9. 简述ECMAScript6的新特性

    1.增加块级作用域 2.增加let const 3.解构赋值 4.函数参数拓展(函数参数可以使用默认值,不定参数及拓展参数) 5.增加class类支持 6.增加箭头函数 7.增加模块和模块加载(ES6 ...

  10. spring的作用

    Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB.如果你仅仅使用了Struts或其他的包含了J2EE特有API的framework,你会发现Spring关注了遗留下的问题.Sprin ...