C++调用线程实现QQ消息循环发送
##函数原型
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++运行库,理所当然不必为其多线程安全性而负责。
##实现
#include <iostream> #include <Windows.h> #include <process.h>
using namespace std;
unsigned _stdcall ThreadOne(void* Parg) { 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; }
|