相关文档:http://zh.cppreference.com/w/cpp/thread/async
这只是一篇个人学习笔记,如有错误欢迎指出
咕了C++一段时间,我又回来学习了,这次是关于STL里自带的线程相关的模板函数async
。
async可以非常方便地用来创建一个异步任务,不同于基于libuv那种事件轮回型的异步编程,这个异步是使用一个新的线程来执行任务,而coder不用自己去管理新的线程。
相关文档:http://zh.cppreference.com/w/cpp/thread/async
这只是一篇个人学习笔记,如有错误欢迎指出
咕了C++一段时间,我又回来学习了,这次是关于STL里自带的线程相关的模板函数async
。
async可以非常方便地用来创建一个异步任务,不同于基于libuv那种事件轮回型的异步编程,这个异步是使用一个新的线程来执行任务,而coder不用自己去管理新的线程。
我刚开始学C++的时候似乎还没有lambda表达式这东西。这个blog的第一篇可见文章在2012年8月,还有一些更早的都是些垃圾水文被我删掉了,开设这个blog的时间我记得在学了web一段时间之后,在那之前我也在各种免费php空间搭过wordpress用过一段时间,后来废了。在更之前我还坚持用自己写的“佳佳空间”当blog用了很长一段时间(虽然后来终于还是放弃了,因为写得太垃圾)。推算下来可能要到9年多前了,大概就是小学的时候?反正是在2011年之前,而lambda表达式是C++11标准里的,所以那时候应该确实没有这东西。
好了回到正题。
C++的lambda表达式和js里的有点不一样,它可以自己选择是否打通函数范围之外的上下文,以使用外面的变量。还可以选择如何打通(引用外部变量和复制外部变量)。
lambda函数的结构长这样
[外部变量规则]{函数体}//没参数省略括号 [外部变量规则](参数){函数体}//省略返回类型指定 [外部变量规则](参数)->返回类型{函数体}//到C++11为止的完整形态
C++是我学的第一个编程语言,也是我第一个放弃的编程语言,然后我就进入web路线了。
现在感觉转入web还是个不错的选择,学到的东西比只学C++要广泛的多,现在重新学一学C++来弥补一下某些时候性能上的缺陷。
好久没动C++了,几乎都给忘得差不多了,于是我来打一些复习笔记的说。
写了那么久的js都已经没有主函数的概念了。。。所以出现了函数到处定义,变量到处定义,企图动态修改类之类的事情,然后就是一堆错误信息<(。_。)>
首先从定义变量开始
//括号里代表写不写都一个意思 (signed) short (int) a; (signed) int miao; (signed) (long) int b; (signed) long long (int) d; unsigned short (int) c; unsigned int; unsigned (long) int d; unsigned long long (int) bilibili; float e;//-3.4e38~3.4e38 double f;//long double的默认形式 -1.7e308~1.7e308 (signed) char g;//-128~127(不同值代表不同符号) unsigned char h;//0~255 bool i;//true/false
刚刚在一个群里有人指出一个问题,他认为以下代码结果为15
(++i)+(++i)+(++i)
然后我用mingw环境编译了一下,结果是16
#include "iostream.h" int main(){ int i=3; cout<<(++i)+(++i)+(++i)<<endl; return 0; }
在C++里,变量有指针,比如int *a;之类的,指针的用处是很大的,可以让程序操作过程更加灵活。
我写这篇文章是为了记录刚刚自己无师自通的函数指针和它的用法。
一般的函数用法类似这样【只是举个例子我懒得写return了_( •́ ω •̀ 」∠)/_】
int a(){ cout<<"这是a函数"; } a(); //输出结果:这是a函数
说好的最简单创建方法,所以这篇文章也会很简单。
我折腾了一晚上和半个下午,好不容易才解决了一大堆麻烦的问题,提炼出了网上各种麻烦代码的主要步骤
我一共用了两个文件:
2.cpp 生成2.dll文件
3.cpp 生成3.exe文件
这里省去了大部分教程里都要求包含的头文件
首先就是创建dll 继续阅读最简单的dll创建和调用
这是一个无聊的产物[那是相当无聊才会来做这种东西啊~]
先隆重介绍一下,这是一个可以发出声音的程序![其实就是用Beep函数。。]
然后我给它取了个好长好长名字的名字,叫“音乐灵感的来源~”
然后就上代码了
#include "iostream.h"//带上输出功能 #include "windows.h"//用Beep函数 int main(){ int pinlv;//定义频率变量 for(int i=0;i<1000;i++){//循环999次 pinlv=rand();//得到随机数 while(pinlv>2000){//超出了预定范围的话[频率超过一定范围声音会刺耳听不清] pinlv=rand();//再来得一次随机数,一直到得到范围内的数为止 } Beep(pinlv,200);//哔哔哔哔哔哔~ cout<<i<<" "<<pinlv<<endl;//输出次数和本次的频率为多少 } return 0;//结束啦 }
这是多么可爱的一个程序啊。然后我就不说什么了。。
此代码直接丢进VC或VS或C-Free或其他什么win下的编译器就可以直接编译运行,无需冷藏。。(在VS下需把编码调一下)
#include "windows.h" LRESULT CALLBACK MainWProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: // 窗口客户区需要重画 { HDC hdc; PAINTSTRUCT ps; char szText[] = "这神马程序"; // 使无效的客户区变的有效,并取得设备环境句柄 hdc =BeginPaint (hwnd, &ps) ; // 显示文字 TextOut(hdc, 250, 10, szText, strlen(szText)); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: // 正在销毁窗口 // 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环 PostQuitMessage(0); return 0 ; } // 将我们不处理的消息交给系统做默认处理 return DefWindowProc(hwnd, message, wParam, lParam); } int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { TCHAR szClassName[] = "MainWClass"; WNDCLASSEX wndclass; // 用描述主窗口的参数填充WNDCLASSEX结构 wndclass.cbSize = sizeof(wndclass); // 结构的大小 wndclass.style = CS_HREDRAW|CS_VREDRAW; // 指定如果大小改变就重画 wndclass.lpfnWndProc = MainWProc; // 窗口函数指针 wndclass.cbClsExtra = 0; // 没有额外的类内存 wndclass.cbWndExtra = 0; // 没有额外的窗口内存 wndclass.hInstance = hInstance; // 实例句柄 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); // 使用预定义图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 使用预定义的光标 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 使用白色背景画刷 wndclass.lpszMenuName = NULL; // 不指定菜单 wndclass.lpszClassName = szClassName ; // 窗口类的名称 wndclass.hIconSm = NULL; // 没有类的小图标 // 注册这个窗口类 RegisterClassEx(&wndclass); // 创建主窗口 HWND hwnd = CreateWindowEx( 0, // dwExStyle,扩展样式 szClassName, // lpClassName,类名 "喵~", // lpWindowName,标题 WS_OVERLAPPEDWINDOW, // dwStyle,窗口风格 NULL, // X,初始 X 坐标 NULL, // Y,初始 Y 坐标 1000, // nWidth,宽度 500, // nHeight,高度 NULL, // hWndParent,父窗口句柄 NULL, // hMenu,菜单句柄 hInstance, // hlnstance,程序实例句柄 NULL) ; // lpParam,用户数据 // 显示窗口,刷新窗口客户区 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 从消息堆中取出消息 MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { // 转化键盘消息 TranslateMessage(&msg); // 将消息发送到相应的窗口函数 DispatchMessage(&msg); } // 当GetMessage返回0时程序结束 return msg.wParam; }
这么就写完了