1.simx: 基于C++协程的离散事件仿真库
2.èªå®ä¹View(1)
3.求C++各种平台实用源代码,求各位大神帮下忙。
simx: 基于C++协程的离散事件仿真库
源码:github.com/wwwHui/simx
作者:Hui
起源
在使用 SimCpp 进行交通仿真时,作者遇到了程序被系统杀死和内存占用急剧增加的问题。通过valgrind测试发现,程序存在内存泄漏。string hashcode源码虽然尝试修改SimCpp源码以解决泄漏问题,但最终以失败告终。因此,作者决定参考SimCpp开发一个基于C++协程的离散事件仿真库。
离散事件仿真框架
本仿真库的目标是实现一个支持交通离散事件仿真的库。交通活动可以拆分为一些基础事件,如乘客从A地到B地、车从C地到B地等。这些事件可以用以下方式表示:
为了实现这些事件,需要统一的时间来协调,并记录“等待一段时间”的事件,以便在相应的时间点执行。仿真框架的设计如下:
首先是Event类,表示事件,包含事件执行时间、互动竞技源码事件编号和Process函数等。其次是SimX,用于处理仿真的核心逻辑,包含仿真时间记录、事件ID记录和事件优先队列等。Run函数用于执行所有事件,Timeout函数用于将“等待一段时间”的事件加入到队列中。
基于协程的仿真
C++标准发布后,协程成为C++特性之一。C++的交易渠道源码协程比较基础,使用起来相对复杂。协程是一段可以挂起和恢复的程序,一般是一个支持挂起和恢复的函数。通过协程的挂起和恢复功能,可以实现时间的协调。
以下是一个协程的例子,其中co_await关键字用于挂起当前函数(协程)的执行。协程的挂起是通过co_await表达式实现的,等待体需要实现三个函数:await_ready、await_suspend和await_resume。源码如何看
依据等待体的特性,仿真框架可以这样实现:在需要延时的地方使用SimX类的Timeout函数作为co_await的expr,Timeout函数需要实现相应的功能。
内存泄漏问题
在仿真过程中,可能会遇到内存泄漏问题。对于一些复杂的情况,如部分车的出发时间不确定,作者通过将可能会造成内存泄漏的协程句柄存储下来,并在必要的时候手动释放资源来解决内存泄漏问题。
总结
本文介绍了一个基于C++协程实现的源码剖析spring离散事件仿真库,包含SimX、Event、EventAwait和Promise等类。SimX负责处理仿真逻辑,Event表示仿真事件,EventAwait和Promise则与C++的协程要求配合使用。最后,作者对仿真库的性能进行了测试,并提供了相应的解决方案。
èªå®ä¹View(1)
ç»åè¿åé¢ä¸ç¯å°å°å¦å¦çåºç¡ç¯ä¹åï¼ç»äºå°äºè¿é¶ç¯ï¼æ£å¼è¿å ¥è§£æèªå®ä¹Viewçé¶æ®µãè³äºæ¬ç« è为ä»ä¹è¦å«è¿é¶ç¯(è½ç¶è®²çæ¯åºç¡çå 容)ï¼å 为ä»æ¬ç¯å¼å§ï¼å°ä¼éæ¸æå¼èªå®ä¹Viewçç¥ç§é¢çº±ï¼æ¯ä¸ç¯é½å°æ¯ä¸ä¸ç¯å 容æ´å æ·±å ¥ï¼å©ç¨æå¦çç¥è¯è½å¤å¶ä½æ´å ç«é ·èªå®ä¹Viewï¼å°±åå¨å°é¶ä¸ä¸æ ·ï¼æ¯ä¸ç¯é½æ´ä¸ä¸å±ï¼ 帮å©å¤§å®¶ä¸æ¥æ¥èµ°å人çå· å³°ï¼åºä»»CEOï¼èµ¢åç½å¯ç¾ã 误ï¼æ¯å¸®å©å¤§å®¶æ´å äºè§£é£äºç«é ·çèªå®ä¹Viewæ¯å¦ä½å¶ä½çï¼è¾¾å°ä¸¾ä¸åä¸çææã
ä½ä¸ºä¸ä¸ª<b>æ(hui)追(zhuang)æ±(B)</b>çç¨åºåï¼è¯å®æ³åä¸äºè®©äººç¼åä¸äº®çç¨åºææï¼ä½æ¯ç³»ç»æä¾çé£äºä¸è¬å¾é¾æ»¡è¶³ï¼ä¸ºäº<b>梦(zhuang)æ³(B)</b>å°±å¿ é¡»è¦å¦ä¹ ä¸äºèªå®ä¹Viewãä¸é¢æ们就äºè§£ä¸äºèªå®ä¹Viewç¸å ³çä¸è¥¿ã
èªå®ä¹ViewGroupä¸è¬æ¯å©ç¨ç°æçç»ä»¶æ ¹æ®ç¹å®çå¸å±æ¹å¼æ¥ç»ææ°çç»ä»¶ï¼å¤§å¤ç»§æ¿èªViewGroupæåç§Layoutï¼å å«æåViewã
ä¾å¦ï¼ä¸ä¸ªåºç¨å çåºé¨å¯¼èªæ¡ä¸çæ¡ç®ï¼ä¸è¬é½æ¯ä¸é¢ä¸ºå¾æ ï¼ä¸é¢æ¯æåï¼é£ä¹è¿ä¸¤ä¸ªå°±å¯ä»¥ç¨èªå®ä¹ViewGroupç»åæ为ä¸ä¸ªVeiwï¼æä¾ä¸¤ä¸ªå±æ§åå«ç¨æ¥è®¾ç½®æååå¾çå³å¯ï¼è¿æ ·ä½¿ç¨èµ·æ¥ä¼æ¹ä¾¿å¾å¤ã
å¨æ²¡æç°æçViewï¼éè¦èªå·±å®ç°çæ¶åï¼å°±ä½¿ç¨èªå®ä¹Viewï¼ä¸è¬ç»§æ¿èªViewï¼SurfaceViewæå ¶ä»çViewï¼ä¸å å«åViewã
ä¾å¦ï¼å®ä¹ä¸ä¸ªæ¯æèªå¨å è½½ç½ç»å¾ççImageViewï¼æå¶ä½ä¸ç§ç¹æ®çå¨ç»ææã
<b>ä¸è¬æ¥è¯´ï¼èªå®ä¹Viewå¨å¤§å¤æ°æ åµä¸é½ææ¿ä»£æ¹æ¡ï¼å©ç¨å¾çæè ç»åå¨ç»æ¥å®ç°ï¼ä½æ¯ä½¿ç¨åè å¯è½ä¼é¢ä¸´å åèè´¹è¿å¤§ï¼å¶ä½éº»ç¦æ´è¯¸å¤é®é¢ã</b>
Viewçæé å½æ°æåç§éè½½åå«å¦ä¸
å¯ä»¥çåºï¼å ³äºViewæé å½æ°çåæ°æå¤æå°ï¼å æé¤å 个ä¸å¸¸ç¨çï¼çä¸å¸¸ç¨çåç 究ã
<b>æå个åæ°çæé å½æ°å¨APIçæ¶åææ·»å ä¸ï¼æä¸è¬ä¸ä½¿ç¨ï¼æä¸èèã</b>
æä¸ä¸ªåæ°çæé å½æ°ä¸ç¬¬ä¸ä¸ªåæ°æ¯é»è®¤çStyleï¼è¿éçé»è®¤çStyleæ¯æå®å¨å½åApplicationæActivityæç¨çThemeä¸çé»è®¤Styleï¼ä¸åªæå¨æç¡®è°ç¨çæ¶åæä¼çæï¼ä»¥ç³»ç»ä¸çImageButton为ä¾è¯´æï¼
<b>注æï¼å³ä½¿ä½ å¨Viewä¸ä½¿ç¨äºStyleè¿ä¸ªå±æ§ä¹ä¸ä¼è°ç¨ä¸ä¸ªåæ°çæé å½æ°ï¼æè°ç¨çä¾æ§æ¯ä¸¤ä¸ªåæ°çæé å½æ°ã</b>
<b>ç±äºä¸ä¸ªåæ°çæé å½æ°ç¬¬ä¸ä¸ªåæ°ä¸è¬ä¸ç¨ï¼æä¸èèï¼ç¬¬ä¸ä¸ªåæ°çå ·ä½ç¨æ³ä¼å¨ä»¥åç¨å°çæ¶å详ç»ä»ç»ã</b>
æé¤äºä¸¤ä¸ªä¹åï¼åªå©ä¸ä¸ä¸ªåæ°å两个åæ°çæé å½æ°ï¼ä»ä»¬ç详æ å¦ä¸ï¼
以ä¸æ¹æ³è°ç¨çæ¯<b>ä¸ä¸ªåæ°</b>çæé å½æ°ï¼
以ä¸æ¹æ³è°ç¨çæ¯<b>两个åæ°</b>çæé å½æ°ï¼
å ³äºæé å½æ°å 讲è¿ä¹å¤ï¼å ³äºå¦ä½èªå®ä¹å±æ§å使ç¨attrsä¸çå 容ï¼å¨åé¢ä¼è¯¦ç»è®²è§£ï¼ç®ååªéè¦ç¥éè¿ä¸¤ä¸ªæé å½æ°å¨ä½æ¶è°ç¨å³å¯ã
========
æµéView大å°ä½¿ç¨çæ¯onMeasureå½æ°ï¼æ们å¯ä»¥ä»è¿ä¸¤ä¸ªåæ°ååºå®½é«çç¸å ³æ°æ®ï¼
ä»ä¸é¢å¯ä»¥çåº onMeasure å½æ°ä¸æ widthMeasureSpec å heightMeasureSpec è¿ä¸¤ä¸ª int ç±»åçåæ°ï¼ 毫æ çé®ä»ä»¬æ¯å宽é«ç¸å ³çï¼ <b>ä½å®ä»¬å ¶å®ä¸æ¯å®½åé«ï¼ èæ¯ç±å®½ãé«ååèªæ¹åä¸å¯¹åºç模å¼æ¥åæçä¸ä¸ªå¼ï¼</b>
å¨intç±»åçä½äºè¿å¶ä½ä¸ï¼-è¿ä¸¤ä½è¡¨ç¤ºæ¨¡å¼,~0è¿ä¸åä½è¡¨ç¤ºå®½åé«çå®é å¼ã
以æ°å¼(äºè¿å¶ä¸º: )为ä¾(å ¶ä¸æ¨¡å¼åå®é æ°å¼æ¯è¿å¨ä¸èµ·çï¼ä¸ºäºå±ç¤ºæå°ä»ä»¬åå¼äº)ï¼
å®é ä¸å ³äºä¸é¢çä¸è¥¿äºè§£å³å¯ï¼å¨å®é è¿ç¨ä¹ä¸åªéè¦è®°ä½æä¸ç§æ¨¡å¼ï¼ç¨ MeasureSpec ç getSizeæ¯è·åæ°å¼ï¼ getModeæ¯è·å模å¼å³å¯ã
å¦æ对Viewç宽é«è¿è¡ä¿®æ¹äºï¼<b>ä¸è¦è°ç¨super.onMeasure(widthMeasureSpec,heightMeasureSpec);</b>
è¦è°ç¨<b>setMeasuredDimension(widthsize,heightsize);</b> è¿ä¸ªå½æ°ã
======
è¿ä¸ªå½æ°å¨è§å¾å¤§å°åçæ¹åæ¶è°ç¨ï¼
onSizeChangedå¦ä¸ï¼
å¯ä»¥çåºï¼å®åå个åæ°ï¼åå«ä¸º 宽度ï¼é«åº¦ï¼ä¸ä¸æ¬¡å®½åº¦ï¼ä¸ä¸æ¬¡é«åº¦ã
è¿ä¸ªå½æ°æ¯è¾ç®åï¼æ们åªéå ³æ³¨ 宽度(w), é«åº¦(h) å³å¯ï¼è¿ä¸¤ä¸ªåæ°å°±æ¯Viewæç»ç大å°ã
=========
<b>ç¡®å®å¸å±çå½æ°æ¯onLayoutï¼å®ç¨äºç¡®å®åViewçä½ç½®ï¼å¨èªå®ä¹ViewGroupä¸ä¼ç¨å°ï¼ä»è°ç¨çæ¯åViewçlayoutå½æ°ã</b>
ä¸è¿å ³äºViewçlayoutå½æ°æ们ä¸è¬æ éå ³æ³¨ï¼å 为å¨ä¸è¬æ åµä¸æ们åªéå ³æ³¨Viewèªèº«çåæ ç³»å³å¯ï¼é¤éViewç¶æä¸å¨ç¶VIewæå¤ä½ç½®ç¸å ³ã
å¨èªå®ä¹ViewGroupä¸ï¼onLayoutä¸è¬æ¯å¾ªç¯ååºåViewï¼ç¶åç»è¿è®¡ç®å¾åºå个åViewä½ç½®çåæ å¼ï¼ç¶åç¨ä»¥ä¸å½æ°è®¾ç½®åViewä½ç½®ã
å个åæ°åå«ä¸ºï¼
å ·ä½å¯ä»¥åè åæ ç³» è¿ç¯æç« :
PSï¼å ³äºonLayoutè¿ä¸ªå½æ°å¨è®²è§£èªå®ä¹ViewGroupçæ¶åä¼è¯¦ç»è®²è§£ã
========
onDrawæ¯å®é ç»å¶çé¨åï¼ä¹å°±æ¯æ们çæ£å ³å¿çé¨åï¼ä½¿ç¨çæ¯Canvasç»å¾ã
å ³äºCanvasç»å¾å¦åä¸ç« å§ï¼æ¬æ¥æ³åä¸äºå ³äºCanvasåºæ¬æä½ççï¼å¯æ¯ç¯å¹ 太é¿äºQAQï¼ ç个尾巴ä¸ä¸ç¯ååå§ï¼æ¯ç«Canvasç»å¾ä¹æ¯ä¸ä¸ªæ¯è¾åºå¤§çä¸è¥¿ï¼ä¹ä¸æ¯ä¸è¨ä¸¤è¯å°±è½è®²æç½çï¼å°±å°è¿éå§ã
======
èªå®ä¹å®Viewä¹åï¼ä¸è¬ä¼å¯¹å¤æ´é²ä¸äºæ¥å£ï¼ç¨äºæä½Viewçç¸å ³å±æ§ï¼æ§å¶Viewçç¶æçï¼æè éè¦çå¬Viewçååï¼å ·ä½è¿æ¯ç¨åå讲å§(继ç»æå)ã
PS ï¼å®é ä¸ViewGroupæ¯Viewçä¸ä¸ªåç±»ã
View
ViewGroup
View.MeasureSpec
onMeasureï¼MeasureSpecæºç æµç¨ æ路详解
Androidä¸èªå®ä¹æ ·å¼ä¸Viewçæé å½æ°ä¸ç第ä¸ä¸ªåæ°defStyleçæä¹
android viewæé å½æ°ç 究
Android Viewæé æ¹æ³ç¬¬ä¸åæ°ä½¿ç¨æ¹æ³è¯¦è§£
Android èªå®ä¹View onMeasureæ¹æ³çå®ç°
Android APIæå(äº)èªå®ä¹æ§ä»¶ä¹ onMeasure
Androidä¸Viewçç»å¶è¿ç¨ onMeasureæ¹æ³ç®è¿°
求C++各种平台实用源代码,求各位大神帮下忙。
// 项目三—学员管理系统.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<string.h>
#include<windows.h>
int k=0;
struct Student
{
int no;
char name[];
float score[3];
float avg;
float sum;
}stu[],shuchu[];
void print(int a); //输出函数
void menu(); //目录
void one(); //选择一
void two(); //选择二
void three(Student stu1[]); //选择三
void fore(); //选择四
void five(); //选择五
void six(); //选择六
void sever(); //选择七
void eight(); //选择八
void nine(); //选择九
void xuanzhe(int a); //选择函数
int chongfu(Student stu[],int a); //判断学号是否重复
int PDmingzi(Student st[],int num); //判断名字是否合法
void fanhui(); //是否返回主菜单
void fuzhi(Student a[],int num);
int _tmain(int argc, _TCHAR* argv[])
{
//登陆模板
char user[];
char passwork[];
int count=0;
while (count<3)
{
printf("\n\n\t\t请输入用户名:");
gets_s(user);
printf("\t\t请输入密码:");
gets_s(passwork);
if(strcmp(user,"admin")==0&&strcmp(passwork,"")==0)
{
system("cls");
printf("\n\n\t\t登陆成功");
Sleep();printf(">");Sleep();printf(">");Sleep();printf(">");Sleep();printf(">");
Sleep();printf(">");Sleep();printf(">");Sleep();Sleep();printf(">");Sleep();
printf(">");
menu();//调用菜单函数
break;
}
else
{
if (count==2)
{
printf("\t提示:您输入用户和密码错误次数过多,请稍后再试!\n");
system("cls");
break;
}
else
{
printf("\n\n\t\t登陆失败!请重新输入!\n");
}
count++;
system("cls");
}
}
return 0;
}
//菜单
void menu()
{
system("cls");
int count=0;
while(count<3)
{
printf("\n\t\t学 员 管 理 系 统 平 台\n");
printf("---------------------------------\n");
printf("\t◎功能菜单:\n");
printf("\n\t\t-----------------------------\n");
Sleep();
printf("\t\t1、单个学员的信息循环录入\n");
printf("\t\t------------------------------\n");
printf("\t\t2、显示所有学员的信息\n");
printf("\t\t------------------------------\n");
printf("\t\t3、排序显示所有学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t4、插入单个学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t5、删除单个学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t6、查找单个学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t7、读取所有学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t8、保存所有学员信息\n");
printf("\t\t------------------------------\n");
printf("\t\t9、退出程序\n");
printf("\t\t------------------------------\n");
printf("请选择:");
char a;
int b;
fflush(stdin);
a=getchar();
if (a>=(1+'0')&&a<=(9+'0'))
{
b=(int)a-'0';
xuanzhe(b);
}
else
{
count++;
if (count==2)
{
system("cls");
printf("错误次数过多!");
break;
}
}
}
}
//选择
void xuanzhe(int a)//选择
{
switch (a)
{
case 1:
system("cls");
one();
break;
case 2:
system("cls");
two();
break;
case 3:
system("cls");
three(stu);
fanhui();
break;
case 4:
system("cls");
fore();
break;
case 5:
system("cls");
five();
break;
case 6:
system("cls");
six();
fanhui();
break;
case 7:
system("cls");
sever();
break;
case 8:
system("cls");
eight();
break;
case 9:
system("cls");
nine();
break;
default:
break;
}
}
//1
void one()
{
char s;
printf("1、单个成绩循环录入:\n");
while (true)//接收输入的
{
while(true)
{
printf("学号:");
scanf_s("%d",&stu[k].no);
if (chongfu(stu,k))
{
printf("学号重复请重新输入!\n");
}
else
{
break;
}
}
while (true)
{
printf("姓名:");
fflush(stdin);
gets_s(stu[k].name);
int a=strlen(stu[k].name);
if (a==0)
{
printf("提示:名字不能为空,请重新输入!\n");
}
else if(PDmingzi(stu,a))
{
printf("提示:名字不能为数字,请重新输入!\n");
}
else
{
break;
}
}
for (int i = 0; i < 3; i++)
{
printf("成绩%d:",i+1);
scanf_s("%f",&stu[k].score[i]);
if (!(stu[k].score[i]<=&&stu[k].score[i]>=0))
{
i--;
printf("输入有误!!请重新输入\n");
continue;
}
}
stu[k].sum=stu[k].score[0]+stu[k].score[1]+stu[k].score[2];
stu[k].avg=stu[k].sum/3.0;
while (true)
{
printf("是否继续录入Y/N?");
fflush(stdin);
s=getchar();
if (s=='N'||s=='n')
{
fuzhi(stu,k);
print(k);
printf("是否返回主菜单(Y/N):");
char a;
fflush(stdin);
a=getchar();
if (a=='y'||a=='Y')
{
menu();
}
}
else if (s=='y'||s=='Y')
{
break;
}
else
{
printf("你的输入有误!请重新输入!\n");
}
}
k++;
}
}
//读正输入的
void print(int a)
{
printf("学号\t姓名\t成绩一\t成绩二\t成绩三\t总成绩\t平均分\n");
for (int i = 0; i <=a ; i++)
{
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",shuchu[i].no,shuchu[i].name,shuchu[i].score[0],shuchu[i].score[1],shuchu[i].score[2],shuchu[i].sum,shuchu[i].avg);
}
}
void two()
{
printf("学员信息:\n");
fuzhi(stu,k);
print(k);
fanhui();
}
void three(Student stu1[])
{
//根据平均分降排序所有学员信息
for (int i = 0; i <k ; i++)
{
for (int j = 0; j < k-i; j++)
{
if (stu1[j].avg<stu[j+1].avg)
{
Student temp;
temp=stu1[j];
stu1[j]=stu1[j+1];
stu1[j+1]=temp;
}
}
}
fuzhi(stu1,k);
print(k);
}
void fore()
{
three(stu);
printf("1、插入单个学生信息:\n");
while (true)//接收输入的
{
if (k>0)
k++;
while(true)
{
printf("学号:");
scanf_s("%d",&stu[k].no);
if (chongfu(stu,k))
{
printf("学号重复请重新输入!\n");
}
else
{
break;
}
}
while (true)
{
printf("姓名:");
fflush(stdin);
gets_s(stu[k].name);
int a=strlen(stu[k].name);
if (a==0)
{
printf("提示:名字不能为空,请重新输入!\n");
}
else if(PDmingzi(stu,a))
{
printf("提示:名字不能为数字,请重新输入!\n");
}
else
{
break;
}
}
for (int i = 0; i < 3; i++)
{
printf("成绩%d:",i+1);
scanf_s("%f",&stu[k].score[i]);
if (!(stu[k].score[i]<=&&stu[k].score[i]>=0))
{
i--;
printf("输入有误!!请重新输入\n");
continue;
}
}
stu[k].sum=stu[k].score[0]+stu[k].score[1]+stu[k].score[2];
stu[k].avg=stu[k].sum/3.0;
char s;
while (true)
{
printf("是否继续插入Y/N?");
fflush(stdin);
s=getchar();
if (s=='N'||s=='n')
{
system("cls");
fanhui();
}
else if (s=='y'||s=='Y')
{
break;
}
else
{
printf("你的输入有误!请重新输入!\n");
}
}
}
}
void five()
{
//删除单个学员的信息
print(k);
printf("请输入要删除的学员信息的学号:");
int num;
scanf_s("%d",&num);
int i;
for ( i= 0; i <= k; i++)
{
if (stu[i].no==num)
{
break;
}
}
for (int j = i; j <= k; j++)
{
stu[i]=stu[i+1];
}
k-=1;
fanhui();
}
void six()
{
Student a[1];
while (true)
{
printf("请输入要查找的学员信息的学号:");
int num;
scanf_s("%d",&num);
int i;
for ( i= 0; i <= k; i++)
{
if (stu[i].no==num)
{
a[0]=stu[i];
fuzhi(a,0);
print(0);
}
}
}
}
void sever()
{
FILE *p;
fopen_s(&p,"d:\\项目三存储.txt","rb");
if (p!=NULL)
{
int n=fread(stu,sizeof(struct Student),,p);
if (k==0)
{
k=n-1;
}
}
fclose(p);
}
void eight()
{
FILE *fp;
fopen_s(&fp,"d:\\项目三存储.txt","wb");
fwrite(&stu,sizeof(struct Student),k+1,fp);
fflush(fp);
fclose(fp);
printf("保存成功!\n");
fanhui();
}
void nine()
{
exit(1);
}
int chongfu(Student stu[],int a)
{
for (int i = 0; i < a; i++)
{
if (stu[a].no==stu[i].no)
{
return 1;
}
}
return 0;
}
int PDmingzi(Student st[],int num)
{
for (int i = 0; i <= num; i++)
{
if(st[k].name[i]>='0'&&st[k].name[i]<='9')
{
return 1;
}
}
return 0;
}
void fuzhi(Student a[],int num)
{
for (int i = 0; i <= num; i++)
{
shuchu[i]=a[i];
}
}
void fanhui()
{
printf("是否返回主菜单(Y/N):");
char a;
fflush(stdin);
a=getchar();
if (a=='y'||a=='Y')
{
menu();
}
}