当前位置: 首页 > news >正文

IO多路复用

一、概述

IO多路复用:进程同时检查多个文件描述符,以找出他们中的任何一个是否可执行IO操作。

核心:同时检查多个文件描述符,看他们是否准备好了执行IO操作。文件描述符就绪状态的转化是通过一些IO事件来触发。

二、水平触发和边缘触发

水平触发:文件描述符可以非阻塞执行IO系统调用,此时认为它已经就绪。

边缘触发:文件描述符自上次检查以来有了新IO活动

在这里插入图片描述

水平触发通知时,可以在任意时刻检查文件描述符的就绪状态(即可以多次重复检查,文件描述符一直处于就绪状态),因此,没必要每次当文件描述符处于就绪状态尽可能多执行IO操作

边缘触发通知时,只有当IO事件发生时我们才会收到通知。因此尽可能多的执行IO操作。一般设计思路:用循环操作IO,IO操作函数应设置为非阻塞状态。

三、select系统调用

1、接口

#include <sys/select.h>/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>// 系统调用会一直阻塞,直到一个或多个文件描述符集合成为就绪态
// 返回值:-1 - 有错误发生、0 - 无就绪文件描述符、正整数 - 就绪的文件描述符个数
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);// 将文件描述符fd从fdset所指向的集合中移除
void FD_CLR(int fd, fd_set *set);
// 判断fd是否是fdset所指向的集合中的成员
int  FD_ISSET(int fd, fd_set *set);
// 将文件描述符fd添加到由fdset所指向的集合中
void FD_SET(int fd, fd_set *set);
// 将fdset指向的集合初始化为空
void FD_ZERO(fd_set *set);#include <sys/select.h>int pselect(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, const struct timespec *timeout,const sigset_t *sigmask);

2、文件描述符说明

readfds:用来检查输入是否就绪的文件描述符集合。

writefds:用来检查输出是否就绪的文件描述符集合。

exceptfds:用来检查异常情况是否发生的文件描述符集合。

四、poll 系统调用

1、接口

struct pollfd {int   fd;         /* file descriptor */short events;     /* requested events */short revents;    /* returned events */
};#include <poll.h>
// 返回值:-1 - 错误、0 - 无就绪文件描述符、正整数 - 就绪文件描述符个数
int poll(struct pollfd *fds, nfds_t nfds, int timeout);#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <signal.h>
#include <poll.h>int ppoll(struct pollfd *fds, nfds_t nfds,const struct timespec *tmo_p, const sigset_t *sigmask);

2、pollfd结构体中掩码位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXMkb6yE-1678192420784)(E:\note\Linux 应用开发\picture\pollfd结构体中掩码.png)]

五、select和poll存在问题

1、当检查大量处于密集范围内的文件描述符时,该操作耗时的时间将大大超过接下来操作。

2、需要检查fd集合需要在用户空间和内核空间来回拷贝。

3、select和poll返回后,程序需要检查返回的数据结构中的每个元素,以查明哪个文件描述符处于就绪状态。

六、信号驱动IO

七、epoll 编程接口

1、epoll接口概述

epoll API 由以下 3 个系统调用组成。

1、epoll_create() 创建一个epoll实例,返回代表该实例的文件描述符。

2、epoll_ctl() 操作epoll实例相关联的兴趣列表。

3、epoll_wait() 返回与epoll实例相关链的就绪列表成员。

2、创建epoll实例

#include <sys/epoll.h>int epoll_create(int size);
int epoll_create1(int flags);

3、修改epoll的兴趣列表

#include <sys/epoll.h>int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

4、事件等待

#include <sys/epoll.h>int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,int maxevents, int timeout,const sigset_t *sigmask);

附录一:select实现高并发socket服务器

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>#define BUF_LEN 1024int main(int argc, char *argv[])
{pid_t dPid = 0;struct sockaddr_in addr;struct sockaddr_in cliaddr;socklen_t clilen = sizeof(struct sockaddr_in);int cfd=0;  // 客户端 fdint sfd=0;  // 服务端 fdint i = 0, n = 0;fd_set tmpfds;  // 向select传递参数,并从select返回结果fd_set rdfds;   // 系统对 fd_set 扫描的 fd 管理变量。int maxfd;      // 最大的文件描述符int connfd[FD_SETSIZE]; // 连接描述符管理int maxi = 0;               // connfd有效的文件描述符最大值int nready;     // select 返回值char buf[BUF_LEN] = "";/* 1、初始化select相关变量 */// 文件描述符集初始化FD_ZERO(&tmpfds);FD_ZERO(&rdfds);// 初始化有效的文件描述符集,为-1表示不可用for(i=0;i<FD_SETSIZE;i++){connfd[i] = -1;}/* 2、socket编程 */// 1、创建服务器 socketsfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){return -1;}// 2、初始化 sockaddr_un 结构体memset(&addr,0,sizeof(struct sockaddr_in));addr.sin_family = AF_INET;inet_pton(AF_INET,"127.0.0.1",&addr.sin_addr);addr.sin_port = htons(8888);bzero(&(addr.sin_zero),8);// 3、绑定 IP 地址和端口号if(bind(sfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) == -1){goto ERROTR_RETURN;}// 4、监听客户端连接if(listen(sfd,10) == -1){goto ERROTR_RETURN;}/* 3、添加监听fd到select扫描集合 */FD_SET(sfd,&rdfds);maxfd = sfd;/* 4、调用select扫描文件描述符,并处理相关返回 */while(1){tmpfds = rdfds;nready = select(maxfd+1,&tmpfds,NULL,NULL,NULL);if(nready > 0){// 有就绪文件描述符if(FD_ISSET(sfd,&tmpfds)){// 监听文件描述符就绪cfd = accept(sfd,(struct sockaddr *)&cliaddr,&clilen);if(cfd == -1){printf("accept errno!\r\n");exit(-1);}// 保存当前文件描述符for(i=0;i<FD_SETSIZE;i++){if(connfd[i]==-1){connfd[i] = cfd;break;}}// 若连接总数达到的最大值,关闭但前连接if(i==FD_SETSIZE){close(cfd);printf("too many clients,i==[%d]\n",i);continue;}//确保connfd中maxi保存的是最后一个文件描述符的下标if(i>maxi){maxi = i;}//打印客户端的IP和PORTchar sIP[16];memset(sIP,0x00,sizeof(sIP));printf("receive from client ---->IP[%s],PORT=[%d]\n",inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,sIP,sizeof(sIP)),htons(cliaddr.sin_port));//将新的文件描述符加入到select监控的文件描述符中FD_SET(cfd,&rdfds);// 调整最大fdif(maxfd<cfd){maxfd = cfd;}//如果没有变化的文件描述符,则无需执行后续代码if(--nready<=0){continue;}}//通信文件描述符就绪for(i=0;i<=maxi;i++){int sockfd = connfd[i];//数组内的文件描述符如果被释放,有可能变为-1if(sockfd==-1){continue;}if(FD_ISSET(sockfd,&tmpfds)){memset(buf,0x00,sizeof(buf));n = read(sockfd,buf,sizeof(buf));if(n<0){// socket 异常perror("read over");close(sockfd);FD_CLR(sockfd,&rdfds);connfd[i] = -1;//将connfd[0]置为-1,表示位置可用}else if(n==0){// socket 关闭printf("client is closed\n");close(sockfd);FD_CLR(sockfd,&rdfds);connfd[i] = -1;//将connfd[0]置为-1,表示位置可用}else{// 数据接收printf("[%d]:[%s]\n",n,buf);write(sockfd,buf,n);}if(--nready<=0){break;//注意这里是break,而不是continue,应该是从最外层的while继续循环}}}}}return 0;
ERROTR_RETURN:close(sfd);return -1;
}

附录二:poll实现高并发socket服务器

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <poll.h>#define BUF_LEN 1024
#define OPEN_MAX 1024int main(int argc, char *argv[])
{pid_t dPid = 0;struct sockaddr_in addr;struct sockaddr_in cliaddr;socklen_t clilen = sizeof(struct sockaddr_in);int cfd=0;  // 客户端 fdint sfd=0;  // 服务端 fdstruct pollfd client[OPEN_MAX]; // 文件描述符集管理数组int nfds = 0;                   // client最大有效下标int nready = 0;                 // poll 返回值int i = 0;char buf[BUF_LEN] = "";/* 1、poll相关配置 */// 1、初始化文件描述符集管理数组for(int i = 0;i < OPEN_MAX; i++){client[i].fd = -1;          // 文件描述符都初始化为-1client[i].events = POLLIN;  // 默认全部只监听读事件}/* 2、socket编程 */// 1、创建服务器 socketsfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){return -1;}// 2、初始化 sockaddr_un 结构体memset(&addr,0,sizeof(struct sockaddr_in));addr.sin_family = AF_INET;inet_pton(AF_INET,"127.0.0.1",&addr.sin_addr);addr.sin_port = htons(8888);bzero(&(addr.sin_zero),8);// 3、绑定 IP 地址和端口号if(bind(sfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) == -1){goto ERROTR_RETURN;}// 4、监听客户端连接if(listen(sfd,10) == -1){goto ERROTR_RETURN;}/* 3、将监听socket添加到poll扫描集合中 */client[0].fd = sfd; // 要监听的第一个文件描述符是lfdclient[0].events = POLLIN; // 要监听lfd的读事件/* 4、调用poll扫描文件描述符集 */while(1){nready = poll(client,nfds+1,-1);if(client[0].revents & POLLIN){// 有客户端连接int cfd = accept(sfd, (struct sockaddr*)&cliaddr, &clilen);char sIP[16];memset(sIP,0x00,sizeof(sIP));printf("receive from client ---->IP[%s],PORT=[%d]\n",inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,sIP,sizeof(sIP)),htons(cliaddr.sin_port));for(i = 1; i < OPEN_MAX; i++){if(client[i].fd < 0){client[i].fd = cfd;break;}}if(i == OPEN_MAX){// 客户端连接数操作上限close(cfd);printf("too many clients,i==[%d]\n",i);continue;}// 更新扫描fd集合个数if(i> nfds){nfds = i; }// 判断是否处理完成if(--nready == 0){continue; // 就一个事件,而且是新连接,没必要往下执行了}}// 通信socket状态有变化for(i = 0; i < OPEN_MAX ; i++){if(client[i].fd < 0){// 当前client无效continue;}if(client[i].revents & POLLIN){// 接收到数据int n = read(client[i].fd, buf, sizeof(buf));if(n < 0){perror("read err");close(client[i].fd); // 该文件描述符无用了,关闭client[i].fd = -1;}if(n == 0){printf("client[%d] closed\n",i);close(client[i].fd);client[i].fd = -1;}else{write(client[i].fd, buf, n);printf("[%d]:[%s]\n",n,buf);}if(--nready == 0){break; // 为了防止循环1024}}}}return 0;
ERROTR_RETURN:close(sfd);return -1;
}

附录三:epoll实现高并发socket服务器

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>#define BUF_LEN 1024
#define OPEN_MAX 1024int main(int argc, char *argv[])
{pid_t dPid = 0;struct sockaddr_in addr;struct sockaddr_in cliaddr;socklen_t clilen = sizeof(struct sockaddr_in);int cfd=0;  // 客户端 fdint sfd=0;  // 服务端 fdint clientfd=0;struct epoll_event event;   // 告诉内核要监听什么事件  struct epoll_event wait_event[OPEN_MAX]; //内核监听完的结果int i = 0;int nready = 0;char buf[BUF_LEN] = "";/* 1、socket编程 */// 1、创建服务器 socketsfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){return -1;}// 2、初始化 sockaddr_un 结构体memset(&addr,0,sizeof(struct sockaddr_in));addr.sin_family = AF_INET;inet_pton(AF_INET,"127.0.0.1",&addr.sin_addr);addr.sin_port = htons(8888);bzero(&(addr.sin_zero),8);// 3、绑定 IP 地址和端口号if(bind(sfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) == -1){goto ERROTR_RETURN;}// 4、监听客户端连接if(listen(sfd,10) == -1){goto ERROTR_RETURN;}/* 2、epoll 配置 */// 创建一个 epoll 的句柄,参数要大于 0, 没有太大意义int epfd = epoll_create(10);  if( -1 == epfd ){  perror ("epoll_create");  return -1;  }// 将sfd添加到扫描fd集合event.data.fd = sfd;     //监听套接字  event.events = EPOLLIN; // 表示对应的文件描述符可以读int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &event);  if(-1 == ret){  perror("epoll_ctl");  return -1;  } while(1){nready = epoll_wait(epfd, wait_event, OPEN_MAX, -1);if(nready == -1){exit(EXIT_FAILURE);}for(int i = 0 ; i < nready; i++){if(wait_event[i].data.fd == sfd){// 有客户端连接cfd = accept(sfd, (struct sockaddr *)&cliaddr, &clilen);if(cfd == -1){//连接建立失败continue;}event.events = EPOLLIN;event.data.fd = cfd;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &event);}else{// 通信socket准备就绪clientfd = wait_event[i].data.fd;ret = recv(clientfd, buf, 1024, 0);if(ret < 0){//现在是不可能-1的,但是如果一直while读,读空了就会返回-1if(errno == EAGAIN || errno == EWOULDBLOCK){continue; //资源暂不可用, 再尝试一次}else{//出错close(clientfd);event.events = EPOLLIN;event.data.fd = clientfd;epoll_ctl(clientfd, EPOLL_CTL_DEL,clientfd, &event);}}else if(ret == 0){ // recv 返回0代表连接已经断开printf("连接被关闭%d\n",clientfd);close(clientfd);event.events = EPOLLIN;event.data.fd = clientfd;epoll_ctl(clientfd, EPOLL_CTL_DEL,clientfd, &event);                }else{printf("[%d]:[%s]\n",ret,buf);}}}}return 0;
ERROTR_RETURN:close(sfd);return -1;
}

相关文章:

IO多路复用

一、概述 IO多路复用&#xff1a;进程同时检查多个文件描述符&#xff0c;以找出他们中的任何一个是否可执行IO操作。 核心&#xff1a;同时检查多个文件描述符&#xff0c;看他们是否准备好了执行IO操作。文件描述符就绪状态的转化是通过一些IO事件来触发。 二、水平触发和…...

Python中的错误是什么,Python中有哪些错误

7.1 错误(errors) 由于Python代码通常是人类编写的&#xff0c;那么无论代码是在解释之前还是运行之后&#xff0c;或多或少总会出现一些问题。 在Python代码解释时遇到的问题称为错误&#xff0c;通常是语法和缩进问题导致的&#xff0c;这些错误会导致代码无法通过解释器的解…...

记录自己开发一款小程序中所遇到的问题(uniapp+uview)(持续更新)

每次开发小程序中&#xff0c;都会遇到各种各样的问题。但是有的问题已经遇到过了&#xff0c;但是遇到的时候还是要各种的问度娘。 特此出这篇文章&#xff0c;方便自己也是方便大家。 仅供参考 1. u-collapse的样式在h5中正常&#xff0c;但是运行到微信小程序中样式就乱了…...

华为机试 HJ43 迷宫问题

经典迷宫问题dfs 题目链接 描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走…...

数据结构|链表

概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的形式就像一条铁链环环相扣它与顺序表最大的不同是&#xff0c;单链表的数据存储是在不连续的空间&#xff0c;存储的数据里面含有…...

计算机写论文时,怎么引用文献? - 易智编译EaseEditing

首先需要清楚哪些引用必须注明[1]&#xff1a; 任何直接引用都要用引号并注明来源&#xff1b; 任何不是自己的口头或书面的观点、解释和结论都应注明来源&#xff1b; 即使不用原话&#xff0c;但是他人的思路、概念或观点也应注明&#xff1b; 不要为了适合你的观点修改原…...

实验三:贪心

1.减肥的小k1 题目描述 小K没事干&#xff0c;他要搬砖头&#xff0c;为了达到较好的减肥效果&#xff0c;教练规定的方式很特别&#xff1a; 每一次&#xff0c;小K可以把两堆砖头合并到一起&#xff0c;消耗的体力等于两堆砖头的重量之和。 经过 n-1次合并后&#xff0c; …...

MySQL日志文件

文章目录1.MySQL中的日志文件2.bin log的作用3.redo log的作用4.bin log和redo log的区别&#xff08;1&#xff09;存储的内容&#xff08;2&#xff09;功能&#xff08;3&#xff09;写入时间&#xff08;4&#xff09;写入方式5.两阶段提交6.undo log的作用1.MySQL中的日志…...

Intel8086处理器使用NASM汇编语言实现操作系统08-关于负数的相关处理idiv/cbw/cwde/cdqu/cwd/cdq/cdo/

很多人都知道一个有符号的数&#xff0c;最高位是1&#xff0c;则表示负数&#xff0c;最高位是0&#xff0c;则表示正数&#xff0c;如果假设我的CPU是4位CPU&#xff0c;那么对于1001这个数&#xff0c;是表示9&#xff0c;还是表示-7呢&#xff1f;&#xff1f;&#xff1f;…...

JavaScript 混淆技术

根据JShaman&#xff08;JShaman是专业的JavaScript代码混淆加密网站&#xff09;提供的消息&#xff0c;JavaScript混淆技术大体有以下几种&#xff1a; 变量混淆 将带有JS代码的变量名、方法名、常量名随机变为无意义的类乱码字符串&#xff0c;降低代码可读性&#xff0c;如…...

安装库报错:No CUDA runtime is found, using CUDA_HOME=‘/usr/local/cuda-11.3‘

1、报错内容 安装库时报错&#xff1a; No CUDA runtime is found, using CUDA_HOME/usr/local/cuda-11.32、检查 查看cuda版本和pytorch版本 python 进入python环境 import torch torch.__version__ torch.cuda.is_available()nvidia-smi 因此发现是由于该虚拟环境中CUDA与…...

CVTE前端面经(2023)

CVTE前端面经项目介绍&#xff08;重点&#xff09;在数据B中找到数组A对应的值&#xff0c;并把数组B对应的值放在数据最前面css1 定位2 外边距3 css高级应用3.1. 过渡3.2. 变形2. 浮动2.1 浮动元素特点2. 2 清除浮动3. html5语义标签4. 实现圣杯布局的两种方式4.1 定位浮动4.…...

基于EB工具的TC3xx_MCAL配置开发02_ICU模块配置

目录 1.概述2. ICU 硬件通道属性确认3. ICU通道配置3.1 添加一个Chanel3.2 IcuChannel->General配置3.3 IcuSignalMeasurement配置3.4 GtmTimerInputConfiguration配置3.5 MCU中的关联配置3.5.1 分配TIM资源给ICU使用3.5.2 设置TIM通道时钟分频系数1.概述 本篇开始我们基于…...

jmeter高阶系列--beanshell返回值中提取参数

1 准备环境 jmeter版本&#xff1a; ** &#xff0c;JDK&#xff1a;1.8将json.jar包置于…\apache-jmeter-5.1\lib\下&#xff1b;否则会报&#xff1a;Typed variable declaration : Class: JSONObject not found in namespace的错误&#xff1b;处理器&#xff1a;Beanshel…...

面向对象

面向对象面向对象一、什么是对象二、什么是面向对象三、对象四、什么是类五、实例变量六、实例方法七、方法重载(overload)八、构造方法九、对象的创建过程十、构造方法重载十一、this关键字面向对象 一、什么是对象 万物皆对象。 二、什么是面向对象 面向对象是一种编程思想。…...

mpi4py 运行过程中出现Read -1, expected xxx, errno = 1 解决方案

目录 问题描述 代码1&#xff08;串行&#xff09; 代码2&#xff08;并行&#xff09; 代码2执行时所用指令 错误信息 解决方案 解决方案1 解决方案2 问题描述 今天正在学习使用mpi4py&#xff0c;在对比运行以下2个代码时疯狂报错&#xff1a; 代码1&#xff08;串…...

PMP考前冲刺3.07 | 2023新征程,一举拿证

题目1-2&#xff1a;1.某公司启动了一个新型智能家电研发敏捷项目&#xff0c;组织上聘请了一位敏捷管理专业人士。在项目执行过程中&#xff0c;敏捷团队反馈用户故事包含的信息不足&#xff0c;无法理解需求&#xff0c;敏捷管理专业人应该怎么做&#xff1f;A.教导产品负责人…...

60条Python日常工作中的高频写法,收藏

一、 数字 1 求绝对值 绝对值或复数的模 In [1]: abs(-6) Out[1]: 62 进制转化 十进制转换为二进制&#xff1a; In [2]: bin(10) Out[2]: 0b1010十进制转换为八进制&#xff1a; In [3]: oct(9) Out[3]: 0o11十进制转换为十六进制&#xff1a; In [4]: hex(15) Out[4]:…...

(小甲鱼python)函数笔记合集七 函数(XI)总结 python函数的函数文档、类型注释、内省详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解函数的闭包&#xff08;工厂函…...

Leetcode是什么

力扣&#xff08;LeetCode&#xff09;是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷&#xff0c;力扣为全球程序员提供了专业的IT 技术职业化提升平台&#xff0c;有效帮助程序员实现快速进步和长期成长。 此外&#xff0c;力扣&#xff08;Leet…...

2023-03-07 MySQL—基于规则优化-子查询优化

简介 在使用MySQL编写查询语句时,有时候无法避免的会写出一些执行起来十分耗时、耗性能的语句,但是MySQL在执行这些语句的时候,还是会竭尽全力的做出一些优化,把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以被称作查询重写 条件化简 我们编写查询…...

Rocketmq技术详解

Rocketmq技术详解 运维部署 docker-compose.yml version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports:- 9876:9876volumes:- ./logs:/opt/logs- ./store:/opt/storenetworks:rmq:aliases:- rmqnamesrvrmqbroker:image: foxisw…...

TeeChart VCL/FMX v2023 crack

TeeChart VCL/FMX v2023 crack TeeChart Pro VCL允许您为所有领域(包括商业、工程、金融、统计、科学、医疗、实时和网络)创建通用和专用图表和绘图应用程序。TeeChart Pro VCL具有多种图表类型的图表库&#xff0c;包括2D或3D线条、条形图、水平条、区域、点、饼图、箭头、气泡…...

[Java·算法·困难]LeetCode32. 最长有效括号

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 输入&#xff1a;s "(()&q…...

pytorch如何搭建一个最简单的模型,

一、搭建模型的步骤 在 PyTorch 中&#xff0c;可以使用 torch.nn 模块来搭建深度学习模型。具体步骤如下&#xff1a; 定义一个继承自 torch.nn.Module 的类&#xff0c;这个类将作为我们自己定义的模型。 在类的构造函数 __init__() 中定义网络的各个层和参数。可以使用 to…...

JS实现css的hover效果,兼容移动端

Hi I’m Shendi JS实现css的hover效果&#xff0c;兼容移动端 功能概述 CSS的hover即触碰时触发&#xff0c;在电脑端鼠标触碰&#xff0c;移动端手指触摸 有的时候光靠css实现不了一些效果&#xff0c;例如元素触发hover&#xff0c;其他元素触发动画效果&#xff0c;所以需要…...

企业微信的后台怎么进入和管理?

企业微信管理后台&#xff0c;只有企业的管理员才可以进企业微信后台&#xff0c;普通员工想要进入后台、可以联系管理员将你设置为后台管理员。 一、怎么进入企业微信后台 管理员进入企业微信后台有两种路径&#xff1b; 路径一&#xff1a; 企业管理员直接在浏览器搜索企…...

【2223sW2】LOG2

写在前面 好好学习&#xff0c;走出宿舍&#xff0c;走向毕设&#xff01; 一些心路历程记录&#xff0c;很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧&#xff0c;还是不要给自己的查重挖坑罢了 23.3.2 检验FFT 早上师兄帮忙看了一眼我画的丑图&#xff…...

buuctf-web-[SUCTF 2018]MultiSQL1

打开界面&#xff0c;全部点击一遍&#xff0c;只有注册和登录功能可以使用注册一个账号&#xff0c;注册admin提示用户存在&#xff0c;可能有二次注入&#xff0c;注册admin自动加了一个字符&#xff0c;无法二次注入&#xff0c;点击其他功能点换浏览器重新登录后&#xff0…...

GitLab创建仓库分配权限

文章目录创建仓库分配权限参考资料创建仓库 点击“New project”创建新项目 分配权限 点击左侧菜单栏“Members”成员&#xff0c;菜单 “Invite member”邀请成员&#xff0c;添加人员&#xff1b;“Invite group”邀请组织&#xff0c;添加一个组织所有成员下面输入框搜索…...

商务型网站模板/个人优秀网页设计

有时我们需要判断是不是ajax请求来决定模块输出还是json格式输出.PHP判断ajax请求的原理:在发送ajax请求的时候&#xff0c;我们可以通过XMLHttpRequest这个对象&#xff0c;创建自定义的header头信息&#xff0c; 在jquery框架中&#xff0c;对于通过它的$.ajax, $.get, or $.…...

网页设计基础教程视频教程/seo优化裤子关键词

qt中有时候使用new后并没有使用delete&#xff0c;原因是 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 #include "mainwindow.h" #include <QApplication> #include <QTextCodec> #include <QLabel> int main(int argc, char *argv[…...

一般做网站多少钱/菏泽百度推广公司电话

在工程勘察设计企业高质量发展的大背景下&#xff0c;对人才的要求越来越高&#xff0c;很多企业希望通过传统的培训有效提升员工能力&#xff0c;实际上往往收效甚微。笔者认为一场有效的培训必须基于人员与岗位的匹配度&#xff0c;而匹配度确定的一个基础工作是岗位胜任力。…...

怎么建立一个网站?/网站建设推广多少钱

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot支持Java Util Logging、Log4J、Log4J2和LockBack作为日志框架&#xff0c;无论使用哪种日志框架&#xff0c;Spring Boot都为当前使用的日志框架的控制台及文件输出做好了配置。 默认使用LockBack日志框架。…...

进行优化/郑州网站seo

OpenJDK中同时会有好几个项目在进行中。这些项目所带来的修改可能会加入到以后版本的JDK中。本文带你看一下OpenJDK中正在进行的重要项目&#xff0c;提前了解以后版本的JDK中会增加的功能。AmberAmber项目关注的是Java语言的小改动。Amber项目的一些成果已经被添加到JDK中。这…...

杭州电子商务网站开发/google下载官方版

P12 JWindow 窗口1.概述2.JWindow 代码实例3.效果演示4.实现鼠标拖动 JWindow 窗口5.效果演示系统&#xff1a;Win10 Java&#xff1a;1.8.0_333 IDEA&#xff1a;2020.3.4 Gitee&#xff1a;https://gitee.com/lijinjiang01/JavaSwing 1.概述 JWindow&#xff1a;一个容器&am…...