【多线程】学习1

学习http://blog.csdn.net/column/details/killthreadseries.html系列的笔记

做为小白果然是要从头学起...

预备知识:

HANDLE(句柄)是Windows操作系统中的一个概念。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。
句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。
句柄列表:每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程,和文件等,进程中的所有线程都可以访问这些资源。
其实我们编程时输出一下句柄的值就可以发现这些值往往非常小(<100)。由此就可以看出句柄的性质了。
无效的返回值为: INVALID_HANDLE_VALUE
 
LPVOID 是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候再转换回来。
可以将其理解为long型的指针,指向void型。
 
system () 函数 
  功 能: 发出一个DOS命令
  用 法: int system(char *command);
  system("pause") :可以实现冻结屏幕,便于观察程序的执行结果;
  system("CLS") :可以实现清屏操作。
  system("color 0A") :其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
  0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡   紫色 E=淡黄色 F=亮白色
 
例一:
C语言调用DOS命令实现定时关机:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int print()
{
    printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪
");
    printf("╔═══╧╧C语言关机程序 ╧╧═══╗
");
    printf("║※1.实现10分钟内的定时关闭计算机 ║
");
    printf("║※2.立即关闭计算机  ║
");
    printf("║※3.注销计算机  ║
");
    printf("║※0.退出系统  ║
");
    printf("╚═══════════════════╝
");
    return 0;
}
void main()
{
    system("title C语言关机程序");//设置cmd窗口标题
    system("mode con cols=48 lines=25");//窗口宽度高度
    system("color 0B");
    system("date /T");
    system("TIME /T");
    char cmd[20]="shutdown -s -t ";
    char t[5]="0";
    print();
    int c;
    scanf("%d",&c);
    getchar();
    switch(c)
    {
        case 1:printf("您想在多少秒后自动关闭计算机?(0~600)
");scanf("%s",t);system(strcat(cmd,t));break;
        case 2:system("shutdown -p");break;
        case 3:system("shutdown -l");break;
        case 0:break;
        default:printf("Error!
");
    }
    system("pause");
    exit(0);
}                

用C语言删除文件,例如文件的位置是d:123.txt

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
  system("del d:\123.txt");
  return 0;
}

START:

#include <stdio.h>
#include <Windows.h>

//子线程函数
DWORD WINAPI ThreadFun(LPVOID pM)
{
    printf("子线程的线程ID号为:%d
子线程输出Hello World
",GetCurrentThreadId());
    return 0;
}

int main()
{
    HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
    WaitForSingleObject(handle, INFINITE);
    return 0;
}

第一个 CreateThread

函数功能:创建线程

函数原型:

HANDLE WINAPI CreateThread(

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  SIZE_T dwStackSize,

  LPTHREAD_START_ROUTINE lpStartAddress,

  LPVOID lpParameter,

  DWORD dwCreationFlags,

  LPDWORD lpThreadId

);

函数说明:

第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。

第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)。

第三个参数表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

第四个参数是传给线程函数的参数。

第五个参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。

第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。

函数返回值:

成功返回新线程的句柄,失败返回NULL。 

第二个 WaitForSingleObject

函数功能:等待函数 – 使线程进入等待状态,直到指定的内核对象被触发。

函数原形:

DWORD WINAPI WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

);

函数说明:

第一个参数为要等待的内核对象。

第二个参数为最长等待的时间,以毫秒为单位,如传入5000就表示5秒,传入0就立即返回,传入INFINITE表示无限等待。

因为线程的句柄在线程运行时是未触发的,线程结束运行,句柄处于触发状态。所以可以用WaitForSingleObject()来等待一个线程结束运行。

函数返回值:

在指定的时间内对象被触发,函数返回WAIT_OBJECT_0。超过最长等待时间对象仍未被触发返回WAIT_TIMEOUT。传入参数有错误将返回WAIT_FAILED

原文地址:https://www.cnblogs.com/dplearning/p/4022521.html