1 什么是线程(Threads)? 什么是多线程? 怎么在windows中观察多线程?

线程可以简单理解为主程序为解决一个问题而选择的其中一条路线。

同理,多线程就是同时选择不同的路线来解决此问题。

windows可在任务管理器中,“选择列”选项中选择“线程”即可查看进程的线程。

2 创建线程

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性 通常为NULL
SIZE_T dwStackSize, // 参数用于设定线程可以将多少地址空间用于它自己的堆栈
// 每个线程拥有它自己的堆栈
LPTHREAD_START_ROUTINE lpStartAddress, // 参数用于指明想要新线程执行的线程函数的地址
LPVOID lpParameter, // 线程函数的参数
// 在线程启动执行时将该参数传递给线程函数
// 既可以是数字,也可以是指向包含其他信息的一个数据结构的指针
DWORD dwCreationFlags, // 0 创建完毕立即调度 CREATE_SUSPENDED创建后挂起
LPDWORD lpThreadId // 线程ID
);
// 返回值:线程句柄

线程句柄与线程ID:

线程是由Windows内核负责创建与管理的,句柄相当于一个令牌,有了这个令牌就可以使用线程对象.

线程ID是身份证,唯一的,系统进行线程调度的时候要使用的.

创建线程代码:

//创建一个新的线程
HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc,
NULL, 0, NULL); //如果不在其他的地方引用它 关闭句柄
::CloseHandle(hThread);

线程函数:

DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data

3 向线程函数传递变量的两种方式:

(1) 全局变量

(2) 线程参数

4 控制台代码举例

#include <stdio.h>
#include <windows.h> DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
for (int i = 0; i < 1000; i++)
{
printf("---------------\n");
Sleep(1000);
}
return 0;
} void MyTest()
{
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
} int main(int argc, char *argv[])
{
MyTest();
for (int i = 0; i < 1000; i++)
{
printf("+++++++++++++\n");
Sleep(1000);
}
return 0;
}



5 窗口程序代码举例

HANDLE hThread = CreateThread(NULL, 0, Timer, NULL, 0, NULL);
CloseHandle(hThread);
DWORD WINAPI Timer(LPVOID lpParameter)
{
//获取文本框内容
TCHAR szBuffer[10];
memset(szBuffer, 0, 10);
GetWindowText(hEdit, szBuffer, 10);
//转成整数
DWORD dwTimer;
sscanf(szBuffer, "%d", &dwTimer); while(dwTimer > 0)
{
//转成字符串
memset(szBuffer, 0, 10);
sprintf(szBuffer, "%d", --dwTimer);
Sleep(1000);
//写回
SetWindowText(hEdit, szBuffer);
}
return 0;
}

涉及函数解释

文本框赋值:
SetWindowText(句柄,数据缓存区); 文本框取值:
GetWindowText(句柄,数据缓冲区,长度); 数字转字符:
sprintf(数据缓冲区,"%d",数字); 字符转数字:
sscanf( szBuffer, "%d", &dwTimer ); 获取子窗口:
GetDlgItem(hDlg,IDC_EDIT_TIMER);

零基础逆向工程33_Win32_07_创建线程的更多相关文章

  1. 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码

    向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...

  2. 零基础逆向工程39_Win32_13_进程创建_句柄表_挂起方式创建进程

    1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个 ...

  3. 零基础逆向工程38_Win32_12_信号量_线程控制小结

    1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE Create ...

  4. 零基础逆向工程37_Win32_11_事件_线程同步

    1 内核对象 前面已经学过线程和互斥体两个内核对象.此节讲了事件这个内核对象.前面提出了内核对象这个概念,可能不太清晰,简单来说内核对象就是系统层的东西. 1.1 小结内核对象: 进程.线程.事件.互 ...

  5. 零基础逆向工程34_Win32_08_线程控制_CONTEXT结构

    线程控制 实验 挂起线程 ::SuspendThread(hThread); 恢复线程 ::ResumeThread(hThread); 终止线程 (这里讲了同步调用与异步调用) 方式一: 此方法结束 ...

  6. 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别

    1 引言 讲了第二个内核对象,互斥体.前面已经学过一个内核对象,线程.这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects().因此这两个函数是根据 ...

  7. 零基础逆向工程35_Win32_09_临界区_CRITICAL_SECTION结构

    1 引入 为什么会存在临界区这中机制呢?是为多线程同时访问全局变量而引入的.也就是上一篇帖子的末尾流出的问题程序的解决办法. 看懂了上面的,那么我们再罗嗦总结一下: 1.多线程访问全局变量时,存在线程 ...

  8. 零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出

    1 多字节字符 ASCII码表:0 ~ 2^7-1 扩展ASCII码表:2^7 ~ 2^8-1 什么是GB2312:1980年,两个字节存储一个汉字:不通用,别国会有乱码. UCICODE:只有一个字 ...

  9. 零基础逆向工程31_Win32_05_提取图标_修改标题

    在程序中使用图标 1.加载图标 HICON hIcon; hIcon = LoadIcon (hAppInstance, MAKEINTRESOURCE (IDI_ICON)); hAppInstan ...

随机推荐

  1. DP【洛谷P2295】 MICE

    P2295 MICE S国的动物园是一个N*M的网格图,左上角的坐标是(1,1),右下角的坐标是(N,M). 小象在动物园的左上角,它想回到右下角的家里去睡觉,但是动物园中有一些老鼠,而小象又很害怕老 ...

  2. Hbase0.98.0完全分布式搭建---【使用外部zookeeper】

    Hbase是一个分布式的实时数据库,他可以基于hadoop的hdfs,S3等分布式存储系统.而且使用zookeeper来通信(查询元数据和获取数据所在位置等功能) 本文的Hbase使用的是hadoop ...

  3. redis分布式锁的使用

    一  本身自带的方法进行使用: <dependency> <groupId>redis.clients</groupId> <artifactId>je ...

  4. IE浏览器提示对象不支持“append”属性或方法

    如下代码在IE浏览器中无法执行,提示对象不支持“append”属性或方法 var tImg = document.createElement("img"); tImg.setAtt ...

  5. windows_study_4

    描述:如何在虚拟外面访问虚机内的网站 解决:http://虚机ip.网站地址(http://192.168.124.41/wx/sites/tf/)

  6. flex布局基础

    一.Flex布局是什么? Flex 即:"弹性布局" 任何一个容器都可以指定为Flex布局 .box{ display:flex; } 行内元素也可以使用Flex布局 .box{ ...

  7. poj2001 Shortest Prefixes(字典树)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21642   Accepted: 926 ...

  8. python模块之beautifulSoup

    1. Beautiful Soup的简单介绍 Beautiful Soup是python的一个库,主要的功能是从网页抓取数据,并对数据进行分析.官方解释为:Beautiful Soup提供一些简单的. ...

  9. php数组·的方法3-数组指针

    /* * 数组指针函数 * */ //key() current() 指针一直停在第一位 不会下移 echo '<hr>'; $arr5 = array('name' => 'hxq ...

  10. java——链表映射 LinkedListMap

    好像也不是基于链表来实现的,而是采用与链表类似的节点形式重新定义了一个节点内部类,以此来实现映射 public class LinkedListMap<K, V> implements M ...