// 头文件
#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. CSS 多栏布局 固定布局 流动布局

    正常情况下都应该保持元素 height 属性的默认值 auto  . 多栏布局,某一栏目占的总宽度包括它的,Width,margin,padding ,border. CSS3中,应用 box-siz ...

  2. ubuntu 替换国内源,清华源

    参考 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ Ubuntu 的软件源配置文件是 /etc/apt/sources.list.将系统自带的该文 ...

  3. TODO留学小程序,展开,收起失效

    text设置user-select=true后,display: -webkit-box 失效? https://developers.weixin.qq.com/community/develop/ ...

  4. 动态修改网页的 icon 和 title

    在public的index.html中使用 link 和 title 占位(内容随意,获取到数据之后此处的内容会被覆盖) 在App.vue中调用接口获取数据,找到 link 和 title 元素,将获 ...

  5. ISTQB软件测试初级认证模拟题

    参考地址 http://www.docin.com/p-297467364.html 第一章:软件测试基础(18%) 1.学习目标 1.1 为什么需要软件测试? (K2) ① 通过具体的例子,来描述软 ...

  6. go web编程学习记录

    学习 https://segmentfault.com/a/1190000013297625的记录 简单demo package main import "github.com/gin-go ...

  7. shell中;与&&的区别

    &&  后一个命令执行需要依赖前一个命令执行成功 :各个命令都会依次执行,无论成功与否

  8. iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行

    今天开发又遇到老问题了,记录一下. 最近换了电脑 win10+vs 2010+oracle11g 客户端. IIS 发布的项目,开始是 把localhost 换成ip地址 总是报 iis 无法在Web ...

  9. cmd 备份 oracle 数据 dmp文件

    语法 :     exp 用户名/密码@数据库地址/数据库名 file=文件导出地址/文件名.dmp 实例:exp develop/123@localhost/orcl file=e:/2019-02 ...

  10. (jmeter笔记)jmeter远程启用服务器(分布式)

    1.在负载机上安装jmeter,修改jmeter\bin\jmeter.properties配置: 1)server.rmi.ssl.disable=false 改 server.rmi.ssl.di ...