zoukankan      html  css  js  c++  java
  • 零基础逆向工程33_Win32_07_创建线程

    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("---------------
    ");
    		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("+++++++++++++
    ");
    		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);	
    
    

  • 相关阅读:
    SPOJ 8222 NSUBSTR
    bzoj千题计划284:bzoj2882: 工艺
    bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)
    bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数
    bzoj千题计划281:bzoj4558: [JLoi2016]方
    bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
    bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
    bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
    bzoj千题计划277:bzoj4513: [Sdoi2016]储能表
    bzoj千题计划276:bzoj4515: [Sdoi2016]游戏
  • 原文地址:https://www.cnblogs.com/flatcc/p/7841268.html
Copyright © 2011-2022 走看看