分享我用Qt写的反应测试游戏源码

jasonslaex 2012-04-29 02:01:43
加精




#ifndef REACTIONGAME_H
#define REACTIONGAME_H

#include <QWidget>
#include <QPainter>
#include <QPixmap>
#include <QTimer>
#include <QLCDNumber>
//==================================================================================
//QT写的反应测试游戏.拖动本拉登头像,逃避美国大兵的追击。时间越长代表你的反应能力和智商就越高
//WGM约战平台游戏反应测试游戏.有利于提升你在CS中的反应能力和逻辑能力.
//程序编程人员:Jason's.Alex QQ:531401335
//QT社区群:167304303
//日期:2012/2/10
//==================================================================================
class ReactionGame : public QWidget
{
Q_OBJECT
public:
explicit ReactionGame(QWidget *parent = 0);
virtual ~ReactionGame();
void LoadResources();//载入资源
void ReleaseResources();//释放资源

virtual void paintEvent(QPaintEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseMoveEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);

struct BlockAttr
{
BlockAttr(const QPixmap &image):pixmap(image),xDecrease(false),yDecrease(false){}
QPoint point;
QPixmap pixmap;
bool xDecrease;
bool yDecrease;
};

signals:
void GameOver(const float &score,const QString&);//游戏结束
private:
void CalculatePos(BlockAttr *block);//计算位置
bool HasCollide(const BlockAttr *,const BlockAttr *);//计算时候碰撞
bool CheckValidBound(const BlockAttr *);//检测有效边界
void ResetGame();//重置游戏
void inilizetionGame();//初始化游戏
void NarrowValidRect(QRect *rect);//缩小有效矩形
const QString GetIQHint(const float score);//获取IQ提示
private slots:
void DrawEngine();//绘图引擎

private:
QPainter *painter;
BlockAttr *block1,*block2,*block3,*block4,*dropBlock;
int factor,speed;//伸展因子.和速度
QTimer *timer;
QRect validRect;//有效的矩形区域
int counter;
float score;//分数
QLCDNumber *lcd;//LCD显示计数器
};

#endif // REACTIONGAME_H





#include "reactiongame.h"
#include <QDebug>
#include <QResizeEvent>
#include <QFont>
ReactionGame::ReactionGame(QWidget *parent) :
QWidget(parent)
{
timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),SLOT(DrawEngine()));
lcd=new QLCDNumber(this);
}


ReactionGame::~ReactionGame()
{

}

void ReactionGame::LoadResources()//载入资源
{

block1=new BlockAttr(QPixmap(":/gamepix/game/1"));
block2=new BlockAttr(QPixmap(":gamepix/game/2"));
block3=new BlockAttr(QPixmap(":/gamepix/game/3"));
block4=new BlockAttr(QPixmap(":/gamepix/game/4"));
dropBlock=new BlockAttr(QPixmap(":/gamepix/game/drop"));
this->inilizetionGame();
}

void ReactionGame::ReleaseResources()//释放资源
{
delete block1;
delete block2;
delete block3;
delete block4;
delete dropBlock;
}


void ReactionGame::inilizetionGame()//初始化游戏
{
block1->point.setX(this->width()/2);
block1->point.setY(0);

block2->point.setX(0);
block2->point.setY(this->height()/2);

block3->point.setX(this->width()/2);
block3->point.setY(this->height()-block3->pixmap.height());

block4->point.setX(this->width()-block4->pixmap.width());
block4->point.setY(this->height()/2);

dropBlock->point.setX(this->width()/2);
dropBlock->point.setY(this->height()/2);

validRect.setX(100);
validRect.setY(100);
validRect.setWidth(this->width()-200);
validRect.setHeight(this->height()-200);

counter=1;

factor=1;
speed=2;
score=0;
}

void ReactionGame::paintEvent(QPaintEvent *)
{

painter=new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(Qt::red);
painter->setBrush(QColor(0xbe,0xbe,0xbe));
painter->drawRect(this->rect());

painter->setPen(Qt::yellow);
painter->setBrush(QColor(0xff,0x9d-speed*5,0x6f));
painter->drawRect(this->validRect);

painter->setPen(Qt::blue);
painter->setFont(QFont("Helvetica",12,QFont::Bold));
painter->drawText(this->width()/4,20,tr("Reaction:")+QString::number(score));

painter->drawPixmap(block1->point,block1->pixmap);
painter->drawPixmap(block2->point,block2->pixmap);
painter->drawPixmap(block3->point,block3->pixmap);
painter->drawPixmap(block4->point,block4->pixmap);
painter->drawPixmap(dropBlock->point,dropBlock->pixmap);

if(counter==1)
{
painter->setPen(Qt::magenta);
painter->drawText(validRect,tr("This game is to test the player an instant reaction and logical thinking ability\n"//这个游戏是测试玩家瞬间的反应和逻辑思维能力
"Drag the picture of Osama bin Laden, to avoid the pursuit of American soldiers!\n"//拖动本拉登头像避开美国大兵的追击!
"The longer you pursue on behalf of the higher IQ!"));//追击时间越久代表你智商越高
}

delete painter;

this->update();

}


void ReactionGame::mouseMoveEvent(QMouseEvent *e)
{

dropBlock->point.setX(e->pos().x()-dropBlock->pixmap.width()/2);
dropBlock->point.setY(e->pos().y()-dropBlock->pixmap.height()/2);

}

void ReactionGame::mousePressEvent(QMouseEvent *e)
{
if(e->type()==QMouseEvent::MouseButtonPress)
{
QPoint begin=dropBlock->point;
QPoint end(dropBlock->point.x()+dropBlock->pixmap.size().width(),dropBlock->point.y()+dropBlock->pixmap.size().height());

if(begin.x()<=e->pos().x()&&begin.y()<=e->pos().y()&&end.x()>=e->pos().x()&&end.y()>=e->pos().y())
{
timer->start(1);

}
}
}

void ReactionGame::mouseReleaseEvent(QMouseEvent *e)
{
if(e->type()==QMouseEvent::MouseButtonRelease)
{
this->ResetGame();
}
}

void ReactionGame::DrawEngine()//绘制引擎
{
score=float(speed*counter)/350;//显示分数

for(int i=0;i<speed;++i)
{
CalculatePos(block1);
CalculatePos(block2);
CalculatePos(block3);
CalculatePos(block4);

if(HasCollide(dropBlock,block1)||HasCollide(dropBlock,block2)||
HasCollide(dropBlock,block3)||HasCollide(dropBlock,block4)||!this->CheckValidBound(dropBlock))//如果产生碰撞
{
emit GameOver(score,this->GetIQHint(score));
this->ResetGame();
}

}


counter++;
lcd->display((double)counter/100);

if(counter%500==0)//每五秒提升一次速度
{
speed+=1;
}

if(counter%1000==0)//每十秒缩小有效范围
{
NarrowValidRect(&this->validRect);
}
}

void ReactionGame::ResetGame()//重置游戏
{
timer->stop();
this->inilizetionGame();
this->update();
}

void ReactionGame::CalculatePos(BlockAttr *block)//计算位置
{
int x=block->point.x();
int y=block->point.y();

if(x==0)
{
block->xDecrease=false;

}else if(x+block->pixmap.width()==this->width())
{
block->xDecrease=true;
}

if(y==0)
{
block->yDecrease=false;

}else if(y+block->pixmap.width()==this->height())
{
block->yDecrease=true;
}

if(block->xDecrease)
{
block->point.setX(x-factor);

}else
{
block->point.setX(x+factor);
}

if(block->yDecrease)
{
block->point.setY(y-factor);

}else
{
block->point.setY(y+factor);
}
}


const QString ReactionGame::GetIQHint(const float score)
{
if(score<20)
return tr("Haha, oh you only for fuck off!! As relatively cool *_*");//哈哈,你只适合打飞机哦!!那样比较爽..
else if(score>20&&score<=30)
return tr("Hey. Your life can only do a cannon fodder! -_-!");//哎...你的人生只能做炮灰了!
else if(score>30&&score<=40)
return tr("Wow! Is designed to play the pieces of the original idol Oh! :)");//哇!原来是专门打残局的偶像哦!:)
else if(score>40)
return tr("You'll never who they think are cheating! Or face it! :(");//你一辈子都被他们认为是作弊的!还是面对现实吧! :(

}

bool ReactionGame::HasCollide(const BlockAttr *staticBlock, const BlockAttr *dynamicBlock)//是否产生碰撞
{
QPoint staticCenter(staticBlock->point.x()+staticBlock->pixmap.width()/2,staticBlock->point.y()+staticBlock->pixmap.height()/2);//计算中心点
QPoint dynamicCenter(dynamicBlock->point.x()+dynamicBlock->pixmap.width()/2,dynamicBlock->point.y()+dynamicBlock->pixmap.height()/2);

int staticWidth=staticBlock->pixmap.width();//计算矩形宽度和高度
int staticHeiget=staticBlock->pixmap.height();

int dynamicWidth=dynamicBlock->pixmap.width();
int dynamicHeight=dynamicBlock->pixmap.height();

int xDistance=abs(staticCenter.x()-dynamicCenter.x());//计算。两个矩形中心点的距离
int yDistance=abs(staticCenter.y()-dynamicCenter.y());

if((staticWidth+dynamicWidth)/2>=xDistance&&(staticHeiget+dynamicHeight)/2>=yDistance)//计算是否产生碰撞
{
return true;
}

return false;
}

bool ReactionGame::CheckValidBound(const BlockAttr *block)//验证是否在有效范围
{
QPoint blockCenter(block->point.x()+block->pixmap.width()/2,block->point.y()+block->pixmap.height()/2);//计算中心点
QPoint rectCenter(validRect.x()+validRect.width()/2,validRect.y()+validRect.height()/2);

int xDistance=validRect.width()/2;//计算中心到无效区域的距离
int yDistance=validRect.height()/2;

if(abs(blockCenter.x()-rectCenter.x())+block->pixmap.width()/2-2>=xDistance||abs(blockCenter.y()-rectCenter.y())+block->pixmap.height()/2-2>=yDistance)
{
return false;
}

return true;
}

void ReactionGame::NarrowValidRect(QRect *rect)//缩小矩形
{
int narrowFactor=10;
rect->setX(rect->x()+narrowFactor);
rect->setY(rect->y()+narrowFactor);
rect->setWidth(rect->width()-narrowFactor);
rect->setHeight(rect->height()-narrowFactor);
}
...全文
4284 86 打赏 收藏 转发到动态 举报
写回复
用AI写文章
86 条回复
切换为时间正序
请发表友善的回复…
发表回复
lch922 2013-07-05
  • 打赏
  • 举报
回复
出于SDK考虑,逻辑业务的东西,还是用c或者c++标准比较好一点。
MoMo_KUA_1 2013-06-22
  • 打赏
  • 举报
回复
都是强人
lit908 2012-06-01
  • 打赏
  • 举报
回复
hmm 关于那个qchar qfloat什么的,应该跟opengl是一样的,里面也有很多GLfloat之类的。我的老师给的解释是,因为是跨平台的,没有人能保证你这个系统上的float和另一个系统上的float是完全一样的,有可能占用的字节数就不一样。Opengl 就用GLfloat保证了你的变量不受这些因数干扰(具体怎么实现的,不懂。。。)
所以我感觉用QT里面的这些变量也是一个道理,保证了在跨平台的时候变量的统一性,减少潜在问题。
这也只是老师告诉我的。。。也许有不同见解。
kaonuya 2012-06-01
  • 打赏
  • 举报
回复

学习中!!!!!!
末日星魂 2012-05-31
  • 打赏
  • 举报
回复
Qt的qAbs支持Qt内部的重载了操作符的类型, stl的就不可以。
zhaoyinfei 2012-05-31
  • 打赏
  • 举报
回复
其实你应该选择用QT的Graphicsview框架来做
un_nu 2012-05-31
  • 打赏
  • 举报
回复
学习了
[Quote=引用 76 楼 的回复:]

有标准库最好用标准库,有C++的地方就有标准库,如果有一天QT库淘汰了,标准库还健在。比起你说的abs问题,个人认为,原代码的调用没有任何多余开销,都是基础类型的比较,何来API层级跳跃调用的开销?
另外一般情况下,越高级抽象的封装,效率较之会偏低,QT的封装效率不一定会是最优(但这些并不是此帖的主题☻)

从个人观点上说:楼主写出的这些代码,很不错,希望能再接再励,下面指出一些存在的缺陷……
[/Quote]
Elvins 2012-05-29
  • 打赏
  • 举报
回复
刚接触QT,来学习了~
nimingzhe2008 2012-05-05
  • 打赏
  • 举报
回复
膜拜楼主
xiebin133 2012-05-05
  • 打赏
  • 举报
回复
我只表述一个观点,你的代码是给人看的,你不能强制要求看你代码的人必须要懂QT又要懂STL。你写出的代码应该尽量让人看的懂,而不是加强看代码人的工作量,我看你的代码还必须先去把stl的函数给全学一遍在来看。
cppbegginer 2012-05-05
  • 打赏
  • 举报
回复
有标准库最好用标准库,有C++的地方就有标准库,如果有一天QT库淘汰了,标准库还健在。比起你说的abs问题,个人认为,原代码的调用没有任何多余开销,都是基础类型的比较,何来API层级跳跃调用的开销?
另外一般情况下,越高级抽象的封装,效率较之会偏低,QT的封装效率不一定会是最优(但这些并不是此帖的主题☻)

从个人观点上说:楼主写出的这些代码,很不错,希望能再接再励,下面指出一些存在的缺陷:

从软件工程上说:
楼主的代码把游戏逻辑耦合在UI中。
楼主代码各种写死的数字和字符串,将是未来维护的麻烦处之一,例如你要对游戏升级增加关卡时,调整游戏的数值时等,代码就要各种改,而且改起来会很蛋痛。注释等还可以更有效。

一些delete对象没有赋NULL,指针使用时,没有判断,因为释放资源后,还有可能被调用,这些都是隐患。
载入资源和释放资源时,函数并没有对错误进行报告以及处理,不够严谨。
给用户使用时,该程序不能很好以及快速的定位错误之处。
C++中有智能指针,可以省去你维护指针的工作,让代码更简洁。

从编码技巧上说:
能不new的东西尽量不要new,在堆上分配东西需要更大开销,并且如果你的程序为多线程的话,因为同步的关系,new多了效率必定下降。
...

[Quote=引用 39 楼 的回复:]

引用 38 楼 的回复:

引用 2 楼 的回复:

深夜看到此分享很开心!我学习一下!
qAbs() 和 abs() 你选择了abs()
虽然不是什么致命错误,但是我还是想提一下,不同API层级的跳跃调用,会带来不必要的消耗开销,即使仅仅一条语句仅被调用一次,微乎其微不会造成多大影响,那也是不必要的……

严重的不同意
类似这些算术运算符,本身就是跨平台的,没必要什么都用……
[/Quote]
cppbegginer 2012-05-05
  • 打赏
  • 举报
回复
纠正下,STL是C++的组成部分
cppbegginer 2012-05-05
  • 打赏
  • 举报
回复
stl是C++的基础,学STL的函数需要时间,学QT一样需要时间。另外标准库本身的价值之一就是跨平台,怀疑标准库跨平台能力的人,能举个例子QT能跨标准库不能跨的平台?
liawof 2012-05-04
  • 打赏
  • 举报
回复
我相信应用QT不是为了追求性能的极限,更多的是追求代码的夸平台性,感觉楼上有点跑题了,如果想追求性能极限,那用汇编好了!
xiebin133 2012-05-04
  • 打赏
  • 举报
回复
你用QT编程,必然会用到QT带的类,比如QString,我相信,QString能跨的平台QAbs一样可以跨,qAbs不能跨的平台,我相信QString也很难跨,所以 LS说的 这样,可以很方便地切换到gtk,xcode,wxpython等平台。类似wtl,atl,mfc,bcb也通用。 如果QT本身不支持,你用QT去编程肯定也是不支持的。个人见解。还是从风格统一性我支持用QT封装好的。代码风格统一性很重要,你写的代码是给人读得,不是给机器读得,机器读你的代码只需要几秒钟,但是人读你的代码可能要几天时间。你不能要求别人读你的代码又要懂QT还必须要懂stl。
cppbegginer 2012-05-04
  • 打赏
  • 举报
回复
用标准库里面的东西, 不会影响代码一致性,一般也不需要考虑代码效率,绝大多数情况满足你的需求。QT是个库,不是个编译器,楼上很多搞混了,我用VC一样用QT库
xc84211698 2012-05-04
  • 打赏
  • 举报
回复
作了下测试
abs花费时间:2 微妙
qAbs花费时间:7 微妙

测试平台:ARM 9下使用QT4.6测试

感谢LZ的抛砖引玉。代码写得很不错。
看了大家的回复,偶很倾向于编程中要保持代码的风格统一。
对于性能了,这个要看情况,在嵌入式中有时候1微妙也是非常重要的这也是事实。所以个人很认同 yiyaaixuexi 的观点。

[Quote=引用 2 楼 的回复:]

深夜看到此分享很开心!我学习一下!
qAbs() 和 abs() 你选择了abs()
虽然不是什么致命错误,但是我还是想提一下,不同API层级的跳跃调用,会带来不必要的消耗开销,即使仅仅一条语句仅被调用一次,微乎其微不会造成多大影响,那也是不必要的……
[/Quote]


我举个例子把有次在QT中使用sprintf花费的时间要比使用QT提供的函数要花费的时间要长。所以性能方面还要看各自的封装。
但我对不同API层级的跳跃调用,会带来不必要的消耗开销。这句话很感兴趣。不知道大家能不能解释下


hehe_777 2012-05-03
  • 打赏
  • 举报
回复
本人只能说是来学习的
xiebin133 2012-05-03
  • 打赏
  • 举报
回复
google编码风格里面一直强调一个东西就是程序风格统一性,有时候省去一点点优势也要保持程序风格统一性,所以我认为,如果QT已经封装好的东西,尽量使用它,保持风格统一性很重要。 不过这只是我个人意见。。
FlyXxTt 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 的回复:]

引用 51 楼 的回复:

OK,那么来说执行效率的问题.
再具体环境中,abs和qAbs哪个性能好我不敢打包票,一般的环境中它们因该是一个数量级的.
我认可函数调用的开销,并且在绝大多数的情况下这并不是问题,影响程序性能最大的地方是设计!!!


这也是设计中的细节部分。
请注意我说的程序上下文,我相信Qt程序里大多数还都是使Qt API的,单拎出一行代码,谈效率有什么意义?……
[/Quote]

下图是qt 4.8.0 qAbs的源码:


下图是vc9 stl abs的源码:



qt使用模板来实现,没有单纯封装abs,在编译器优化选项一样的情况下,效率没有差别,qAbs和abs最大的差别仅仅是前面多了一个'Q',至于程序的写法就仁者见仁了,谁也不能保证在使用Qt的项目里能完全不使用stl,Qt的目标也不是替代stl,所以说写abs也不为过。
加载更多回复(48)
内容简介 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编高性能Linux服务器应用的方法、技巧和思想。不仅理论全面、深入,抓住了重点和难点,还包含两个综合性案例,极具实战意义。 《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能服务器编程的核心要素进行了全面深入的剖析,包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;第三部分从侧重实战的角度讲解了高性能服务器的优化与监测,包含服务器的调制、调试和测试,以及各种实用系统监测工具的使用等内容。 本书另外免费赠送一个负载均衡服务器程序的完整实际项目的源代码! 作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的技术。活跃于Chinaunix等专业技术社区,发表了大量关于Linux网络编程的文章,深受社区欢迎。 目录 前言 第一篇 TCPIP协议详解 第1章 TCPIP协议族 1.1 TCPIP协议族体系结构以及主要协议 1.1.1 数据链路层 1.1.2 网络层 1.1.3 传输层 1.1.4 应用层 1.2 封装 1.3 分用 1.4 测试网络 1.5 ARP协议工作原理 1.5.1 以太网ARP请求应答报文详解 1.5.2 ARP高速缓存的查看和修改 1.5.3 使用tcpdump观察ARP通信过程 1.6 DNS工作原理 1.6.1 DNS查询和应答报文详解 1.6.2 Linux下访问DNS服务 1.6.3 使用tcpdump观察DNS通信过程 1.7 socket和TCPIP协议族的关系 第2章 IP协议详解 2.1 IP服务的特点 2.2 IPv4头部结构 2.2.1 IPv4头部结构 2.2.2 使用tcpdump观察IPv4头部结构 2.3 IP分片 2.4 IP路由 2.4.1 IP模块工作流程 2.4.2 路由机制 2.4.3 路由表更新 2.5 IP转发 2.6 重定向 2.6.1 ICMP重定向报文 2.6.2 主机重定向实例 2.7 IPv6头部结构 2.7.1 IPv6固定头部结构 2.7.2 IPv6扩展头部 第3章 TCP协议详解 3.1 TCP服务的特点 3.2 TCP头部结构 3.2.1 TCP固定头部结构 3.2.2 TCP头部选项 3.2.3 使用tcpdump观察TCP头部信息 3.3 TCP连接的建立和关闭 3.3.1 使用tcpdump观察TCP连接的建立和关闭 3.3.2 半关闭状态 3.3.3 连接超时 3.4 TCP状态转移 3.4.1 TCP状态转移总图 3.4.2 TIME_WAIT状态 3.5 复位报文段 3.5.1 访问不存在的端口 3.5.2 异常终止连接 3.5.3 处理半打开连接 3.6 TCP交互数据流 3.7 TCP成块数据流 3.8 带外数据 3.9 TCP超时重传 3.10 拥塞控制 3.10.1 拥塞控制概述 3.10.2 慢启动和拥塞避免 3.10.3 快速重传和快速恢复 第4章 TCPIP通信案例:访问Internet上的Web服务器 4.1 实例总图 4.2 部署代理服务器 4.2.1 HTTP代理服务器的工作原理 4.2.2 部署squid代理服务器 4.3 使用tcpdump抓取传输数据包 4.4 访问DNS服务器 4.5 本地名称查询 4.6 HTTP通信 4.6.1 HTTP请求 4.6.2 HTTP应答 4.7 实例总结 第二篇 深入解析高性能服务器编程 第5章 Linux网络编程基础API 5.1 socket地址API 5.1.1 主机字节序和网络字节序 5.1.2 通用socket地址 5.1.3 专用socket地址 5.1.4 IP地址转换函数 5.2 创建socket 5.3 命名socket 5.4 监听socket 5.5 接受连接 5.6 发起连接 5.7 关闭连接 5.8 数据读 5.8.1 TCP数据读 5.8.2 UDP数据读 5.8.3 通用数据读函数 5.9 带外标记 5.10 地址信息函数 5.11 socket选项 5.11.1 SO_REUSEADDR选项 5.11.2 SO_RCVBUF和SO_SNDBUF选项 5.11.3 SO_RCVLOWAT和SO_SNDLOWAT选项 5.11.4 SO_LINGER选项 5.12 网络信息API 5.12.1 gethostbyname和gethostbyaddr 5.12.2 getservbyname和getservbyport 5.12.3 getaddrinfo 5.12.4 getnameinfo 第6章 高级IO函数 6.1 pipe函数 6.2 dup函数和dup2函数 6.3 readv函数和writev函数 6.4 sendfile函数 6.5 mmap函数和munmap函数 6.6 splice函数 6.7 tee函数 6.8 fcntl函数 第7章 Linux服务器程序规范 7.1 日志 7.1.1 Linux系统日志 7.1.2 syslog函数 7.2 用户信息 7.2.1 UID、EUID、GID和EGID 7.2.2 切换用户 7.3 进程间关系 7.3.1 进程组 7.3.2 会话 7.3.3 用ps命令查看进程关系 7.4 系统资源限制 7.5 改变工作目录和根目录 7.6 服务器程序后台化 第8章 高性能服务器程序框架 8.1 服务器模型 8.1.1 CS模型 8.1.2 P2P模型 8.2 服务器编程框架 8.3 IO模型 8.4 两种高效的事件处理模式 8.4.1 Reactor模式 8.4.2 Proactor模式 8.4.3 模拟Proactor模式 8.5 两种高效的并发模式 8.5.1 半同步半异步模式 8.5.2 领导者追随者模式 8.6 有限状态机 8.7 提高服务器性能的其他建议 8.7.1 池 8.7.2 数据复制 8.7.3 上下文切换和锁 第9章 IO复用 9.1 select系统调用 9.1.1 select API 9.1.2 文件描述符就绪条件 9.1.3 处理带外数据 9.2 poll系统调用 9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞connect 9.6 IO复用的高级应用二:聊天室程序 9.6.1 客户端 9.6.2 服务器 9.7 IO复用的高级应用三:同时处理TCP和UDP服务 9.8 超级服务xinetd 9.8.1 xinetd配置文件 9.8.2 xinetd工作流程 第10章 信号 10.1 Linux信号概述 10.1.1 发送信号 10.1.2 信号处理方式 10.1.3 Linux信号 10.1.4 中断系统调用 10.2 信号函数 10.2.1 signal系统调用 10.2.2 sigaction系统调用 10.3 信号集 10.3.1 信号集函数 10.3.2 进程信号掩码 10.3.3 被挂起的信号 10.4 统一事件源 10.5 网络编程相关信号 10.5.1 SIGHUP 10.5.2 SIGPIPE 10.5.3 SIGURG 第11章 定时器 11.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO 11.2  SIGALRM信号 11.2.1 基于升序链表的定时器 11.2.2 处理非活动连接 11.3 IO复用系统调用的超时参数 11.4 高性能定时器 11.4.1 时间轮 11.4.2 时间堆 第12章 高性能IO框架库Libevent 12.1 IO框架库概述 12.2 Libevent源码分析 12.2.1 一个实例 12.2.2 源代码组织结构 12.2.3 event结构体 12.2.4 往注册事件队列中添加事件处理器 12.2.5 往事件多路分发器中注册事件 12.2.6 eventop结构体 12.2.7 event_base结构体 12.2.8 事件循环 第13章 多进程编程 13.1 fork系统调用 13.2 exec系列系统调用 13.3 处理僵尸进程 13.4 管道 13.5 信号量 13.5.1 信号量原语 13.5.2 semget系统调用 13.5.3 semop系统调用 13.5.4 semctl系统调用 13.5.5 特殊键值IPC_PRIVATE 13.6 共享内存 13.6.1 shmget系统调用 13.6.2 shmat和shmdt系统调用 13.6.3 shmctl系统调用 13.6.4 共享内存的POSIX方法 13.6.5 共享内存实例 13.7 消息队列 13.7.1 msgget系统调用 13.7.2 msgsnd系统调用 13.7.3 msgrcv系统调用 13.7.4 msgctl系统调用 13.8 IPC命令 13.9 在进程间传递文件描述符 第14章 多线程编程 14.1 Linux线程概述 14.1.1 线程模型 14.1.2 Linux线程库 14.2 创建线程和结束线程 14.3 线程属性 14.4 POSIX信号量 14.5 互斥锁 14.5.1 互斥锁基础API 14.5.2 互斥锁属性 14.5.3 死锁举例 14.6 条件变量 14.7 线程同步机制包装类 14.8 多线程环境 14.8.1 可重入函数 14.8.2 线程和进程 14.8.3 线程和信号 第15章 进程池和线程池 15.1 进程池和线程池概述 15.2 处理多客户 15.3 半同步半异步进程池实现 15.4 用进程池实现的简单CGI服务器 15.5 半同步半反应堆线程池实现 15.6 用线程池实现的简单Web服务器 15.6.1 http_conn类 15.6.2 main函数 第三篇 高性能服务器优化与监测 第16章 服务器调制、调试和测试 16.1 最大文件描述符数 16.2 调整内核参数 16.2.1 procsysfs目录下的部分文件 16.2.2 procsysnet目录下的部分文件 16.3 gdb调试 16.3.1 用gdb调试多进程程序 16.3.2 用gdb调试多线程程序 16.4 压力测试 第17章 系统监测工具 17.1 tcpdump 17.2 lsof 17.3 nc 17.4 strace 17.5 netstat 17.6 vmstat 17.7 ifstat 17.8 mpstat

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧