// 头文件
#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. Java高级助教工作总结

    一.助教工作的具体职责和任务 1.帮助老师在云班课上发布作业 2.解答同学们的问题 3.批改同学们的作业,并了解同学们的学习情况 4.在qq群中发布通知,收集同学们的一些意见 二.助教工作的每周时长和 ...

  2. 静态变量设为non-public或者加final关键字

    Class variable fields should not have public accessibility Vulnerability Minor Main sources cwe Avai ...

  3. One-Shot Transfer Learning of Physics-Informed Neural Networks

    本文提出了一种将迁移学习应用到PINN的方法.可以极大的缩短训练PINN所用的时间,目前,PINN所需要的训练次数往往都在成千上万次, 作者通过批量训练PINN,来学习丰富的潜在空间用来执行迁移学习. ...

  4. yarn 安装全局包

    yarn 安装全局包,无法使用,需要添加yarn的bin文件夹到环境变量 然后重启一下即可使用,再装其他全局包也可直接使用

  5. 删除v-for方法生成的组件的方法

    一.思路 在vue:data中的数据对象添加布尔类型的属性,用来表明其是否被渲染,如果需要删除组件,就把这个属性设置为false: 在计算属性vue:computed中,根据该布尔属性过滤,生成一个新 ...

  6. python flatten()函数的作用和用法

    flatten()函数可以执行展平操作,返回一个一维数组. 函数的作用对象是数组array.矩阵mat,不能直接用于列表list. x.flatten()是把numpy对象x降低到一维,默认是按照 行 ...

  7. WebAPI :Get、Post、Delete、Put

    public class RestClientMethod { /// <summary> /// 请求服务器地址 /// </summary> public string B ...

  8. 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found

    问题 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found 解决方法 参考链接:https://blog.csdn.net/weixin_40 ...

  9. 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组

    var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) r ...

  10. Delphi线程中使用waitfor返回值

    使用waitfor的时候就不要再设置Freeonterminated属性了,否则会提示线程句柄错误.主要是里面使用了ExitThread方法,当线程方法执行完毕后会自动释放线程的.不过记得要重写Des ...