好文档 - 专业文书写作范文服务资料分享网站

利用API在Windows下创建进程和线程

天下 分享 时间: 加入收藏 我要投稿 点赞

LPVOID lpParameter,//argument for new thread DWORD dwCreationFlags,//creation flags LPDWORD lpThreadId //pointer to returned thread identifier )

其中,在本实验阶段比较重要的参数是第三和第四个:

a)第三个参数是一个指向函数的指针,所以应传入的参数应为函数的地址,如&Func的形式.而这个传入的参数,则必须被声明成为:

DWORD WINAPI threadFunc(LPVOID threadArgu);

的形式.这个函数也就是要执行线程任务的那个函数体实体.这里应注意,传入应使用Func而非&Func。

如:CreateThread(NULL,0,Func,…)

具体原因:我目前认为是系函数前部使用WINAPI所致。

b)第四个参数应是执行线程任务的函数体实体所需要的参数,即上面所举例的函数threadFunc的参数threadArgu,这在WINDOWS中被定义成一个LPVOID的类型,目前我认为,可以把它在功能上看成和void* 类似。

参考:LPVOID的原型:

typedef void far *LPVOID;

所以,当你有自己需要的类型的参数传入时,可以用

typedef struct { int firstArgu, long secArgu, … }myType,* pMyType;

将你想要传入的参数装入一个结构体中。

在传入点,使用类似:

pMyType pMyTpeyArgu; … CreateThread(NULL,0,threadFunc,pMyTypeArgu,…); …

在函数threadFunc内部的接收点,可以使用“强行转换”,如:

int intValue=((pMyType)lpvoid)->firstArgu; long longValue=((pMyType)lpvoid)->secArgu; … …

2.2 线程实验1---创建N个随机线程,所有线程的执行时间均为T秒,观察每个线程的运行状况:

为了使线程的运行趋于随机化,应先使用:

srand((unsigned int)time (NULL));

在每个线程的运行中,每个线程的睡眠时间为:

sleepTime=1000+30*(int)eRandom(50+tNo); Sleep(sleepTime);

这样,可以使进程的运行趋于随机化.

/*测试程序2:

创建N个随机线程的随机实验.

命令行输入参数:

test threadNo runSecs */ #include #include #include #include #include #define N 5 #define Type float static int runFlag=TRUE; DWORD WINAPI threadWork(LPVOID threadNo); int parseArgToInt(char* inNumChar); Type eRandom(int upLimit); typedef struct { int data; }INTEGER; void main(int argc,char* argv[]) { unsigned int runTime; int i; int threadNum; //int N; SYSTEMTIME now; WORD stopTimeMinute,stopTimeSecond; DWORD targetThreadID; //Get command line argument,N if(argc!=3) { printf(\ return; } threadNum=parseArgToInt(argv[1]); runTime=parseArgToInt(argv[2]); //Get the time the threads should run,runtime //Calculate time to halt // runTime=60;/*in seconds.*/ GetSystemTime(&now); printf(\,%d,%d\\n\,now.wHour,now.wMinute,now.wSecond); stopTimeSecond=(now.wSecond+(WORD)runTime)`; stopTimeMinute=now.wMinute+(now.wSecond+(WORD)runTime)/60; //FOR 1 TO N INTEGER* tmpInt; for(i=0;idata=i; CreateThread(NULL,0,threadWork,tmpInt,0,&targetThreadID); Sleep(100);//Let newly created thread run } //Cycle while children work... while(runFlag) { GetSystemTime(&now); if((now.wMinute>=stopTimeMinute)&&(now.wSecond>=stopTimeSecond)) runFlag=FALSE; Sleep(1000); } Sleep(5000); printf(\} DWORD WINAPI threadWork(LPVOID threadNo) { //local variables double y; const double x=3.14159; const double e=2.7183; int i; const int napTime=1000;//in milliseconds const int busyTime=400; int tNo=((INTEGER*)threadNo)->data; int sleepTime; DWORD result=0; /*randomasize the random num seeds.*/ srand((unsigned int)time (NULL)); while(runFlag) { //Parameterized processor burst phase for(i=0;i='0'&&inNumChar[i]<='9') { equipData=10*equipData+(inNumChar[i]-48); i++; } return equipData; } Type eRandom(int upLimit) { Type tmpData; do { tmpData=((Type)rand()/(Type)32767)*(Type)100.0*(Type)upLimit; } while(tmpData>upLimit); return tmpData; }

利用API在Windows下创建进程和线程

LPVOIDlpParameter,//argumentfornewthreadDWORDdwCreationFlags,//creationflagsLPDWORDlpThreadId//pointertoreturnedthreadidentifier)其中,在本实验阶段比较重要的参数是第三和第四个:a
推荐度:
点击下载文档文档为doc格式
86gj49ktng9sc9l3qczs
领取福利

微信扫码领取福利

微信扫码分享