1 初识多线程
通常一个进程(process)下都是并发运行着多个任务,例如360卫士可以扫描病毒的同时清理系统垃圾文件或者安装软件。而如果在不使用线程的情况下,程序都是按照某个顺序(从上到下,选择或者是循环)单线程运行,这样的效率通常都比较低,服务器得应用以及处理大型数据的程序都是多线程并发同时处理多个任务,这样能够充分利用系统资源,更加高效的完成任务。
单线程VS多线程
单线程同步打开五个对话框:
#include <Windows.h>
#include <process.h>
#include <stdlib.h>
//进程:加载到内存中的程序,至少有一个线程在运行,通常是多线程并发运行
//单线程 程序代码按照同步依次从上到下执行
//多线程 程序代码按照异步乱序执行
/*
单线程显示5个对话框
@author Tony 18601767221@163.com
@since 2016060610 15:33
*/
void show_dialog() {
//如果没有启动多线程则是同步打开五个窗口,一个接着一个按照顺序打开
for (int i = 0; i < 5; i++) {
MessageBoxA(0, "单线程执行", "显示对话框", 0);
}
}
/*
主线程入口
@author Tony 18601767221@163.com
@since 20160609 07:43
*/
void main() {
show_dialog();
system("pause");
}
多线程同时打开五个对话框:
/*
定义线程任务
@author Tony 18601767221@163.com
@since 20160609 07:45
*/
void run(void *p) {
//如果没有启动多线程则是同步打开五个窗口,run方法为普通的方法,而不是作为线程的入口
MessageBoxA(0, "多线程执行", "显示对话框", 0);
}
/*
主线程入口
@author Tony 18601767221@163.com
@since 20160609 07:43
*/
void main() {
for (int i = 0; i < 5;i++) {
//启动线程
_beginthread(run, 0, NULL);//把run函数当做线程的入口点
}
system("pause");
}
2初识动态库
动态库可以作为一个组件,通过工具植入到应用程序当中。
在使用VS2015开发应用程序时,默认生成的都是和项目名称保持一致的可执行程序(例如HelloWorld.exe),而除了.exe之外还可以选择以动态链接库(.dll)的方式生成和以静态链接库(.lib)的方式生成。
如何编写一个dll?看如下程序
#include <Windows.h>
//预编译时去掉DOS窗口
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
/*
dll模块注入
需要先将项目属性的配置类型改成动态链接库(.dll),dll运行时不需要main函数
只需要通过工具将其注入到其他进程中即可
@author Tony 18601767221@163.com
@since 20160609 08:04
*/
//导出接口
_declspec(dllexport) void module() {
MessageBoxA(0, "李彦宏请你到百度去喝茶", "百度系统消息", 0);
for (int i = 0; i < 200;i++) {
malloc(1024*1024*20); //每次循环吃20M内存
}
}
编写完成之后需要将项目默认值的配置类型改为dll,更改输出的dll目标文件名,然后重新生成包含dll模块的源程序,再通过dllinject工具配置dll文件路径和函数名称就可以注射到其他进程中。
3初识静态库
通常情况函数的声明都在头文件中,而函数的实现是在源文件中。如果要想调用一个第三方的库函数,咋办呢?
这里首先实现一个简单的第三方库函数:
在WindowsC的解决方案下新建一个名为WindowsCLibrary的项目
我的项目结构如下:
函数的声明(windowslib.h)如下:
int add(int one, int two); //头文件声明函数
函数的实现(windowslib.c)如下:
int add(int one,int two) {
return one + two; //返回两个整数的和即可
}
编写完头文件和源文件之后将项目设置配置类型为静态库(我这里设置的文件就是WindowsCLibrary.lib)
然后将编译生成后的头文件(windowsclib.h)以及库文件(WindowsCLibrary.lib)都复制到将要调用第三方库函数的项目的根目录下:(C:\Tony\WindowsC\WindowsC\WindowsC)
接下来就可以在WindowsC项目中引用WindowsCLibrary项目的函数了
#include <stdio.h>
#include <stdlib.h>
#include "windowslib.h"
#pragma comment(lib,"WindowsCLibrary.lib") //加载指定的模块
void main() {
int result = add(3, 5);
printf(" result =%d ",result );
for (int i = 0; i < result;i++) {
//system("notepad");
}
system("pause");
}
欢迎扫描下方的二维码,关注微信公众服务号-艺无止境,分享IT技术干货。