// 头文件
#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. linux 安装goland

    一.Goland-IDEA 2020.3.2安装 1 下载 下载GoLand https://www.jetbrains.com/go/download/#section=linux 2 安装Gola ...

  2. git的基本操作(一)

    pwd: 显示当前所在的目录路径 ls: 列出当前目录的所有文件 touch: 新建一个文件 rm:删除一个文件 mkdir:新建一个目录 rm -r:删除一个目录 mv:移动一个文件到另一个文件中 ...

  3. Vulnhub 靶场 BEELZEBUB: 1

    Vulnhub 靶场 BEELZEBUB: 1 前期准备 靶机地址:https://www.vulnhub.com/entry/beelzebub-1,742/ kali攻击机ip:192.168.1 ...

  4. 用xlutils.copy写入中文的问题

    用xlutils.copy 将中文写入excel文档中 遇到的问题1: Traceback:Traceback (most recent call last):File "C:\Users\ ...

  5. linux查看是实体机还是虚拟机

    1.判断虚拟机三种方式 1.dmesg|grep -i hypervisor [root@localhost ~]# dmesg|grep -i hypervisor [ 0.000000] Hype ...

  6. VUE学习-编译到浏览器

    vue文件时怎样编译运行到浏览器的 http://www.manongjc.com/article/21832.html 通过vue-loader,解析.vue文件,在webpack解析,拆解vue组 ...

  7. 12个有用的JavaScript数组技巧

    数组是Javascript最常见的概念之一,它为我们提供了处理数据的许多可能性,熟悉数组的一些常用操作是很有必要的. 1.数组去重 1.from()叠加new Set()方法 字符串或数值型数组的去重 ...

  8. Access-Control-Allow-Origin php跨域报错

    Access-Control-Allow-Origin php跨域 解决办法: 1.PHP中echo:header(""Access-Control-Allow-Origin: * ...

  9. idea提交时忽略.class、.iml文件和文件夹或目录的方法

    第一种方法 在Setings–> Editor --> File Types -->Ignore files and folders中添加需要忽略的文件和文件夹: .idea 忽略 ...

  10. Python批量修改文件名中所包含指定关键字的文件

    1.去掉下图中各文件名中的'xx' 2.Python代码如下(仅供参考) import os, os.path, time def rename(file, keyword): #file: 需要修改 ...