avatar

目录
C++调用线程实现QQ消息循环发送

C++调用线程实现QQ消息循环发送

##函数原型

Code
unsigned long _beginthread(  
void(_cdecl *start_address)(void *), //声明为void (*start_address)(void *)形式
unsigned stack_size, //是线程堆栈大小,一般默认为0
void *arglist //向线程传递的参数,一般为结构体
);

unsigned long _beginthreadex( //推荐使用
void *security, //安全属性,NULL表示默认安全性
unsigned stack_size, //是线程堆栈大小,一般默认为0
unsigned(_stdcall *start_address)(void *), //声明为unsigned(*start_address)(void *)形式
void *argilist, //向线程传递的参数,一般为结构体
unsigned initflag, //新线程的初始状态,0表示立即执行,CREATE_SUSPEND表示创建后挂起。
unsigned *thrdaddr //该变量存放线程标识符,它是CreateThread函数中的线程ID。); //创建成功条件下的将线程句柄转化为unsigned long型返回,创建失败条件下返回0

使用_beginthreadex而不是CreateThread的原因

_beginthreadex在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更安全。

通常建议使用_beginthreadex函数,而不是CreateThread函数,这使得线程中的代码不需要考虑C/C++代码的线程安全性,除非你清楚地知道在新的线程中不会调用到线程不安全的C/C++代码,这时候放心地使用CreateThread也无可厚非(实际上这种情况很难判定)。_beginthreadex保证了某些C/C++运行库代码的线程安全性,而CreateThread没有对这些特殊的C/C++代码做出保证,这里再次强调这两个函数的区别。不要含糊地认为CreateThread的设计存在缺陷,CreateThread的功能并不专门针对于C/C++运行库,理所当然不必为其多线程安全性而负责。

##实现

cpp
#include <iostream>
#include <Windows.h>
#include <process.h>

using namespace std;

unsigned _stdcall ThreadOne(void* Parg) //stdcall自动平衡堆栈
{
cout << "输入发送次数" << endl;
int j;
cin >> j;
for (int i=0 ; i < j; i++)
{
SendMessage((HWND)0x002401E8, WM_PASTE, 0, 0); //获取窗口线程 获取剪切板内容
Sleep(300);
keybd_event(VK_RETURN, 0, 0, 0); //模拟按下回车
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); //模拟弹起回车
}

return 0;
}

int main()
{
_beginthreadex(NULL,NULL,ThreadOne,0,NULL,0); //线程调用
cout << "输入发送次数" << endl;

getchar();
return 0;
}
文章作者: kabeor
文章链接: https://kabeor.github.io/C++%E8%B0%83%E7%94%A8%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0QQ%E6%B6%88%E6%81%AF%E5%BE%AA%E7%8E%AF%E5%8F%91%E9%80%81/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 K's House

评论