// 头文件
#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. Dockerfile CMD命令提示no such file

    过程: 自制一个kafka镜像,启动时CMD命令报ERROR # 安装 kafka ADD kafka_2.12-2.4.1.tgz /home/pmish/software ENV KAFKA_HO ...

  2. Django Cannot assign "A1": "B1" must be a "C1" instance.

    Django Cannot assign "A1": "B1" must be a "C1" instance. 原因:使用了外键 说明:如 ...

  3. c++ 引用 指针。

    一.什么是引用(reference) ?已经存在的对象的另外一个名字. 引用有什么特别的? 1.引用在定义时,以&开头. 2.引用不是对象,只能绑定在对象上.所以必须在初始化的时候,指定引用绑 ...

  4. ABAP 指定字符替换为空格

    上代码 DATA:str1 TYPE string VALUE '小红##爱#six##小绿#666'. *******DATA(str1) = '小红##爱#six##小绿#666'. " ...

  5. 【小记】golang_map

    map 前言:map 几个操作实现有点复杂,即便之前看懂了没过多久也就忘了,这里简单做下记录.为了便于记忆,将 mapassign 的全过程以流程图的方式展示,其他省略 mapassign 在流程图中 ...

  6. Dynamics CRM 安全模型的性能问题

    性能问题对系统的影响可以是致命性的,一旦不重视,在不久的将来随时可能爆发,导致系统卡顿甚至无法操作,即时重启也无济于事:甚至极其难以发现.这里为自己记录一下过往的经验.系统一开始的设计,很大程度上决定 ...

  7. Tomcat 配置文件详解之-- server.xml

    一.背景 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat ...

  8. pytorch中 model.cuda的作用

    在pytorch中,即使是有GPU的机器,它也不会自动使用GPU,而是需要在程序中显示指定.调用model.cuda(),可以将模型加载到GPU上去.这种方法不被提倡,而建议使用model.to(de ...

  9. MFC编辑框字符显示时无法换行的问题解决

    字符串结尾加上"\r\n": 编辑框属性设置:Auto HScroll为False,Multiline为True,Want Return为True.

  10. calibredrv 对layer做操作

    #clip.tclset L [layout create xxx.gds] $L create layer 10.0 $L create polygon 10.0 10 1000 1000 2000 ...