零基础逆向工程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 
#include 

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;
}

零基础逆向工程33_Win32_07_创建线程_第1张图片

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_创建线程_第2张图片

你可能感兴趣的:(零基础逆向工程33_Win32_07_创建线程)