一个Windows C++的线程类实现
2023-09-27 14:28:16 时间
CThread(Runnable * pRunnable);
CThread(const char * ThreadName, Runnable * pRunnable = NULL);
CThread(std::string ThreadName, Runnable * pRunnable = NULL);
~CThread(void);
/**
开始运行线程
@arg bSuspend 开始运行时是否挂起
**/
bool Start(bool bSuspend = false);
/**
运行的线程函数,可以使用派生类重写此函数
**/
virtual void Run();
/**
当前执行此函数线程等待线程结束
@arg timeout 等待超时时间,如果为负数,等待无限时长
**/
void Join(int timeout = -1);
/**
恢复挂起的线程
**/
void Resume();
/**
挂起线程
**/
void Suspend();
/**
终止线程的执行
**/
bool Terminate(unsigned long ExitCode);
unsigned int GetThreadID();
std::string GetThreadName();
void SetThreadName(std::string ThreadName);
void SetThreadName(const char * ThreadName);
private:
static unsigned int WINAPI StaticThreadFunc(void * arg);
private:
HANDLE m_handle;
Runnable * const m_pRunnable;
unsigned int m_ThreadID;
std::string m_ThreadName;
volatile bool m_bRun;
#endif
CThread::CThread(const char * ThreadName, Runnable * pRunnable) : m_ThreadName(ThreadName), m_pRunnable(pRunnable), m_bRun(false) CThread::CThread(std::string ThreadName, Runnable * pRunnable) : m_ThreadName(ThreadName), m_pRunnable(pRunnable), m_bRun(false) bool CThread::Start(bool bSuspend) if(m_bRun) { return true; } if(bSuspend) { m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, CREATE_SUSPENDED, m_ThreadID); } else { m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, m_ThreadID); } m_bRun = (NULL != m_handle); return m_bRun; void CThread::Run() if(!m_bRun) { return; } if(NULL != m_pRunnable) { m_pRunnable- Run(); } m_bRun = false; void CThread::Join(int timeout) if(NULL == m_handle || !m_bRun) { return; } if(timeout = 0) { timeout = INFINITE; } ::WaitForSingleObject(m_handle, timeout); void CThread::Resume() if(NULL == m_handle || !m_bRun) { return; } ::ResumeThread(m_handle); void CThread::Suspend() if(NULL == m_handle || !m_bRun) { return; } ::SuspendThread(m_handle); bool CThread::Terminate(unsigned long ExitCode) if(NULL == m_handle || !m_bRun) { return true; } if(::TerminateThread(m_handle, ExitCode)) { ::CloseHandle(m_handle); return true; } return false; unsigned int CThread::GetThreadID() return m_ThreadID; std::string CThread::GetThreadName() return m_ThreadName; void CThread::SetThreadName(std::string ThreadName) m_ThreadName = ThreadName; void CThread::SetThreadName(const char * ThreadName) if(NULL == ThreadName) { m_ThreadName = ""; } else { m_ThreadName = ThreadName; } unsigned int CThread::StaticThreadFunc(void * arg) CThread * pThread = (CThread *)arg; pThread- Run(); return 0;
【我的前端】CSS在Windows下实现Mac浏览器滚动条 众所周知,Windows 和 macOS 浏览器的滚动条在默认情况下是不一致的,最为显著的是 macOS 的滚动条是不占据屏幕尺寸的,macOS 的滚动条如下:
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】 本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
CThread::CThread(const char * ThreadName, Runnable * pRunnable) : m_ThreadName(ThreadName), m_pRunnable(pRunnable), m_bRun(false) CThread::CThread(std::string ThreadName, Runnable * pRunnable) : m_ThreadName(ThreadName), m_pRunnable(pRunnable), m_bRun(false) bool CThread::Start(bool bSuspend) if(m_bRun) { return true; } if(bSuspend) { m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, CREATE_SUSPENDED, m_ThreadID); } else { m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, m_ThreadID); } m_bRun = (NULL != m_handle); return m_bRun; void CThread::Run() if(!m_bRun) { return; } if(NULL != m_pRunnable) { m_pRunnable- Run(); } m_bRun = false; void CThread::Join(int timeout) if(NULL == m_handle || !m_bRun) { return; } if(timeout = 0) { timeout = INFINITE; } ::WaitForSingleObject(m_handle, timeout); void CThread::Resume() if(NULL == m_handle || !m_bRun) { return; } ::ResumeThread(m_handle); void CThread::Suspend() if(NULL == m_handle || !m_bRun) { return; } ::SuspendThread(m_handle); bool CThread::Terminate(unsigned long ExitCode) if(NULL == m_handle || !m_bRun) { return true; } if(::TerminateThread(m_handle, ExitCode)) { ::CloseHandle(m_handle); return true; } return false; unsigned int CThread::GetThreadID() return m_ThreadID; std::string CThread::GetThreadName() return m_ThreadName; void CThread::SetThreadName(std::string ThreadName) m_ThreadName = ThreadName; void CThread::SetThreadName(const char * ThreadName) if(NULL == ThreadName) { m_ThreadName = ""; } else { m_ThreadName = ThreadName; } unsigned int CThread::StaticThreadFunc(void * arg) CThread * pThread = (CThread *)arg; pThread- Run(); return 0;
用法:
#include "Thread.h"
#include "ThreadPoolExecutor.h"
class R : public Runnable
{
public:
~R()
{
printf("~R/n");
}
void Run()
{
printf("Hello World/n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
R r;
CThread * t = NULL;
t = new CThread(
t- Start();
t- Join();
getchar();
}
from:http://blog.csdn.net/huyiyang2010/article/details/5801597
【我的前端】CSS在Windows下实现Mac浏览器滚动条 众所周知,Windows 和 macOS 浏览器的滚动条在默认情况下是不一致的,最为显著的是 macOS 的滚动条是不占据屏幕尺寸的,macOS 的滚动条如下:
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】 本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
相关文章
- ONS C++ Windows SDK 调试方法及注意事项
- C++开源代码覆盖率工具OpenCppCoverage介绍(Windows)
- C++和Windows平台的一些书籍
- qt中xe运行缺少组件,Qt-c++桌面编程报错:qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““,最终解决方案
- c#和c++的opencv位图数据参数互换问题解决方法
- 纯C++创建Windows窗体(理解WinMain()与WndProc())
- 【转】 谈谈C++中的swap函数
- windows环境下C++代码打印函数堆栈调用情况
- 《C++ 黑客编程揭秘与防范(第2版)》—第6章6.2节详解PE文件结构
- 基于C++实现的简单的网络应用程序【100010682】
- 基于C++实现的(控制台)酒店管理系统【100010667】
- c++中用vector创建多维数组的初始化方法
- [第十届蓝桥杯省赛C++B组]等差数列
- 为python编译C++模块时一定要注意的事情—————不要在anaconda环境下使用cmake来编译C++扩展模块!!!
- C++使用Mysql的详细步骤及各个常用方法的代码演示:select,insert,update,delete
- 让自己的C++程序(非服务程序)运行为一个windows service
- 【华为OD机试真题java、python、c++、JsNode】通信误码【2022 Q4 | 100分】
- 40、【查找】二分查找:数的三次方根(C/C++版)
- 高效学 C++|编程实例之计算器
- C/C++常用函数
- C++ 11开发环境的搭建(Windows Platform)
- C++安全异常std:auto_ptr
- 蓝桥杯练习题三 - 纸牌三角形(c++)
- Windows下C++多线程编程(入门实例)
- 如何使用C++11 auto语法
- Windows下C++软件调试——检测内存泄露
- C/C++ Windows API——获取系统指定目录
- C/C++ Windows API——获取计算机信息