Autoware源码学习笔记(一):Vehicle_socket

  • 一、前言
  • 二、vehicle_receiver
    • 2.1 main函数
    • 2.2 receiverCaller函数
    • 2.3 getCanValue函数
    • 2.4 parseCanValue函数
  • 三、vehicle_sender
    • 3.1 main函数
    • 3.2 vehicleCmdCallback函数
    • 3.3 receiverCaller函数
    • 3.4 sendCommand函数

本文为博主原创内容,未经博主允许不得转载。尊重他人知识成果,共同建立良好学习分享氛围,谢谢!

一、前言

  Vehicle_socket这个Package包含有vehicle_receiver和vehicle_sender两个node,主要是用于autoware平台应用车辆和Android设备的数据传输和通信,其中还涉及到了线程、客户机和服务器之间TCP/IP通信的知识和常用函数。我之前对这方面也不了解,很多内容也是现学现用的,如有错误,还希望各位提出指正。

  看源代码之前,先附上一张图,讲述的是客户机和服务器通信的基本框架思路,以便于更好的帮助理解源代码。
在这里插入图片描述

图1 客户机和服务器通信的基本框架

  博主主要对vehicle_receiver的函数和代码做了详细注释和解释,而vehicle_sender中的基本思路和使用函数与vehicle_receiver基本相似,故vehicle_sender中重复使用的函数没有加以说明。

二、vehicle_receiver

  在以autoware平台应用车辆作为服务器端,Android设备作为客户端的基础上,vehicle_receiver节点建立基本的TCP/IP通信机制,等待Android设备客户端向车辆服务器端发起通信请求,若请求则读取服务器端的数据,并按照一定的格式解析消息内容。其中主要包括了main函数、receiverCaller函数、getCanValue函数和parseCanValue函数。

2.1 main函数

  main函数主要创建了vehicle_receiver节点,然后创建mode_pub和can_pub两个publisher,随后创建一个线程,创建线程成功后,新创建的线程从指定的起始地址执行线程函数receiverCaller,而原来的线程则继续运行下一行代码。

#include <ros/ros.h>
#include <tablet_socket_msgs/mode_info.h>
#include "autoware_can_msgs/CANInfo.h"//先从自定义的文件中找头文件,如果找不到再从函数库中寻找文件。
#include <netinet/in.h>
#include <pthread.h>//在Linux编写多线程程序需要包含该头文件
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>//要使用istringstream、getline等类创建对象就必须包含该头文件
#include <string>
#include <vector>//在函数中使用vector函数,需添加该头文件#define CAN_KEY_MODE (0)
#define CAN_KEY_TIME (1)
#define CAN_KEY_VELOC (2)
#define CAN_KEY_ANGLE (3)
#define CAN_KEY_TORQUE (4)
#define CAN_KEY_ACCEL (5)
#define CAN_KEY_BRAKE (6)
#define CAN_KEY_SHIFT (7)static ros::Publisher can_pub;//创建publisher对象can_pub
static ros::Publisher mode_pub;//创建publisher对象mode_pub
static int mode;int main(int argc, char **argv)
{ros::init(argc, argv, "vehicle_receiver");//ros定义名字为vehicle_receiver的节点ros::NodeHandle nh;//ros实例化句柄对象nhstd::cout << "vehicle receiver" << std::endl;can_pub = nh.advertise<autoware_can_msgs::CANInfo>("can_info", 100);//定义"can_info"topic的内容mode_pub = nh.advertise<tablet_socket_msgs::mode_info>("mode_info", 100);//定义"mode_info"topic的内容pthread_t th;//声明线程IDint ret = pthread_create(&th, nullptr, receiverCaller, nullptr);//创建线程/*原型:int  pthread_create((pthread_t  *thread,  pthread_attr_t  *attr,  void  *(*start_routine)(void  *),  void  *arg)头文件:#include  <pthread.h>功能:创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。说明:thread:线程标识符;attr:线程属性设置;start_routine:线程函数的起始地址;arg:传递给start_routine的参数;返回值:若成功,返回0;若出错,返回-1。*/if (ret != 0){std::perror("pthread_create");/*perror(s) 用来将上一个函数发生错误的原因输出到标准设备。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。*/std::exit(1);/*每个进程都会有一个返回值的. 进程开始时是由系统的一个启动函数掉用了main函数的:int   nMainRetVal   =   main(); 当从main函数退出后,启动函数便调用exit函数,并且把nMainRetVa传递给它. 所以,任何时候都会调用exit函数的。正常情况下,main函数不会调用exit函数的,而是由return 0 返回值给nMainRetVal的,exit再接收这个值作为参数的。所以,正常情况下是以exit(0)退出的,但是如果你的程序发生异常,你可以在main函数中调用exit(1),强制退出程序,强制终止进程.其中1表示不正常退出。    */}ret = pthread_detach(th);/*从状态上实现线程分离,注意不是指该线程独自占用地址空间。分离成功返回0,分离失败返回错误号。线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程),其退出状态不由其他线程获取,而直接自己自动释放(自己清理掉PCB的残留资源)。网络、多线程服务器常用。  */if (ret != 0){std::perror("pthread_detach");std::exit(1);}ros::spin();return 0;
}

2.2 receiverCaller函数

  receiverCaller函数主要通过socket函数创建服务器端的流式套接字,然后使用bind函数将该套接字和指定地址相连接,随后使用listen函数表示服务器已做好准备,可以通信,最后利用accept函数接纳客户端请求并返回客户端套接字标识,并把该标识作为参数传递给线程函数getCanValue。

static void *receiverCaller(void *unused)
{constexpr int listen_port = 10000;/*constexpr是C++11中新增的关键字,其语义是“常量表达式”,其是在编译期就可以计算出结果的表达式。常量表达式的好处:1、允许一些计算只在编译时进行一次,而不是每次程序运行时;2、编译器可以在编译期对constexpr的代码进行非常大的优化,比如将用到的constexpr表达式都直接替换成最终结果等;3、是一种很强的约束,更好地保证程序的正确语义不被破坏;4、相比宏来说,没有额外的开销,但更安全可靠。*/int sock = socket(AF_INET, SOCK_STREAM, 0);/*socket函数的使用方法如下:int socket(int domain, int type, int protocol),若返回值为非负描述符,则表示成功,若返回值为-1,则表示出错。在参数表中,domain指定使用何种的地址类型,比较常用的有:PF_INET, AF_INET: Ipv4网络协议;PF_INET6, AF_INET6: Ipv6网络协议。type参数的作用是设置通信的协议类型,可能的取值如下所示:SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。其应用在C语言socket编程中,在进行网络连接前,需要用socket函数向系统申请一个通信端口;OOB: 在所有数据传送前必须使用connect()来建立连接状态;SOCK_DGRAM: 使用不连续不可靠的数据包连接;SOCK_SEQPACKET: 提供连续可靠的数据包连接;SOCK_RAW: 提供原始网络协议存取;SOCK_RDM: 提供可靠的数据包连接;SOCK_PACKET: 与网络驱动程序直接通信。参数protocol用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0即可。*/if (sock == -1){std::perror("socket");return nullptr;}sockaddr_in client;//sockaddr_in是系统封装的一个结构体,这里实例化一个client来存放地址信息。socklen_t len = sizeof(client);//socklen_t是一种数据类型,它其实和int差不多,在32位机下,size_t和int的长度相同,都是32 bits,但在64位机下,size_t(32bits)和int(64 bits)的长度是不一样的。sockaddr_in addr;//实例化一个addr来存放地址信息std::memset(&addr, 0, sizeof(sockaddr_in));//从addr的初始地址开始到后面的sizeof(sockaddr_in)个字节用0替换并返回addr。这个函数在socket中多用于清空数组addr.sin_family = PF_INET;addr.sin_port = htons(listen_port);addr.sin_addr.s_addr = INADDR_ANY;/*sockaddr_in是系统封装的一个结构体,具体包含了成员变量:sin_family、sin_port、sin_addr、sin_zero等等。sin_family主要用于定义地址族,PF_INET代表TCP/IPsin_port主要用来保存端口号,将监听套接字的端口设置为listen_port,htons表示host to network short,用来进行主机字节序和网络字节序的转换。sin_addr主要用来保存IP地址信息,INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐?所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。sin_zero无特殊含义,只是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。用来将sockaddr_in结构填充到与structsockaddr同样的长度,可以用bzero()或memset()函数将其置为零。  */// make it available immediately to connect// setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));int ret = bind(sock, (sockaddr *)&addr, sizeof(addr));//bind函数把名字和套接字相关联/*int bind(int sockfd, const struct sockaddr *addr,socklen_t *addrlen);当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfd。addrlen指定了以addr所指向的地址结构体的字节长度。一般来说,该操作称为“给套接字命名”。*/if (ret == -1){std::perror("bind");goto error;}ret = listen(sock, 5);/*int PASCAL FAR listen (SOCKET s, int backlog);第一个参数是服务端套接字,你要聆听,总得出来说个话啊,好,就指定你了;第二个参数是等待连接队列的最大长度,比方说,你将backlog定为10, 当有15个连接请求的时候,前面10个连接请求就被放置在请求队列中,后面5个请求被拒绝。再看函数的返回值,成功返回0, 失败返回-1。*/if (ret == -1){std::perror("listen");goto error;}while (true){// get connect to androidstd::cout << "Waiting access..." << std::endl;int *client_sock = new int();*client_sock = accept(sock, reinterpret_cast<sockaddr *>(&client), &len);/*unsigned int sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len);接纳客户端请求的函数是accept,其指定服务端去接受客户端的连接,接收后,返回了客户端套接字的标识,并且获得了客户端套接字的“地方”(包括客户端IP和端口信息等)。第一个参数用来标识服务端套接字(也就是listen函数中设置为监听状态的套接字);第二个参数是用来保存客户端套接字对应的“地方”(包括客户端IP和端口信息等);第三个参数是“地方”的占地大小。返回值对应客户端套接字标识。*/if (*client_sock == -1){std::perror("accept");break;}std::cout << "Get connect" << std::endl;pthread_t th;if (pthread_create(&th, nullptr, getCanValue, static_cast<void *>(client_sock)))//static_cast用法:static_cast < type-id > ( expression ),该运算符把expression转换为type - id类型。{std::perror("pthread_create");break;}ret = pthread_detach(th);if (ret != 0){std::perror("pthread_detach");break;}}error:close(sock);return nullptr;
}

2.3 getCanValue函数

  getCanValue函数主要是客户端通过recv函数从服务器端读取CAN原始数据,然后关闭客户端套接字,随后parseCanValue函数解析CAN原始数据,最后定义can_info和mode_info两个topic的结构内容。

static void *getCanValue(void *arg)
{int *client_sockp = static_cast<int *>(arg);int sock = *client_sockp;delete client_sockp;char recvdata[1024];std::string can_data("");constexpr int LIMIT = 1024 * 1024;while (true){ssize_t n = recv(sock, recvdata, sizeof(recvdata), 0);/*recv函数 int recv( SOCKET s,     char FAR *buf,      int len,     int flags     );  不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0*/if (n < 0){std::perror("recv");can_data = "";break;}else if (n == 0){break;}can_data.append(recvdata, n);/*从字符串recvdata的第0到第n个字符连接在string字符串can_data后面*/// recv data is bigger than 1M,return errorif (can_data.size() > LIMIT){std::cerr << "recv data is too big." << std::endl;can_data = "";break;}}if (close(sock) < 0){std::perror("close");return nullptr;}if (can_data.empty())return nullptr;autoware_can_msgs::CANInfo can_msg;bool ret = parseCanValue(can_data, can_msg);if (!ret)return nullptr;can_msg.header.frame_id = "/can";can_msg.header.stamp = ros::Time::now();can_pub.publish(can_msg);tablet_socket_msgs::mode_info mode_msg;mode_msg.header.frame_id = "/mode";mode_msg.header.stamp = ros::Time::now();mode_msg.mode = mode;mode_pub.publish(mode_msg);return nullptr;
}

2.4 parseCanValue函数

  parseCanValue函数主要解析客户端通过recv函数从服务器端读取到的数据,并更新can_msg和mode的内容。

static bool parseCanValue(const std::string &can_data, autoware_can_msgs::CANInfo &msg)
{std::istringstream ss(can_data);std::vector<std::string> columns;//初始化列表空对象columnsstd::string column;while (std::getline(ss, column, ','))/*getline()的原型:getline(istream &is,string &str,char delim)istream &is表示一个输入流,譬如cin,string表示把从输入流读入的字符串存放在这个字符串中(&str其实就是一个变量)char delim是终止符(默认为回车,还可以是别的符号,如#,*之类的都可以)而对于while(getline(cin,str))来讲,while语句的真实判断对象是cin,也就是当前是否存在有效的输入流,如果存在就不会结束循环*/{columns.push_back(column);//列表尾部插入column}for (std::size_t i = 0; i < columns.size(); i += 2)/*size_t是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。*/{int key = std::stoi(columns[i]);//stoi()可以将string转化为int。switch (key){case CAN_KEY_MODE:mode = std::stoi(columns[i + 1]);if (mode & 0x1){msg.devmode = 1;}else{msg.devmode = 0;}if (mode & 0x2){msg.strmode = 1;}else{msg.strmode = 0;}break;case CAN_KEY_TIME:msg.tm = columns[i + 1].substr(1, columns[i + 1].length() - 2);  // skip 'break;case CAN_KEY_VELOC:msg.speed = std::stod(columns[i + 1]);break;case CAN_KEY_ANGLE:msg.angle = std::stod(columns[i + 1]);break;case CAN_KEY_TORQUE:msg.torque = std::stoi(columns[i + 1]);break;case CAN_KEY_ACCEL:msg.drivepedal = std::stoi(columns[i + 1]);break;case CAN_KEY_BRAKE:msg.brakepedal = std::stoi(columns[i + 1]);break;case CAN_KEY_SHIFT:msg.driveshift = std::stoi(columns[i + 1]);break;default:std::cout << "Warning: unknown key : " << key << std::endl;}}return true;
}

三、vehicle_sender

  在以autoware平台应用车辆作为服务器端,Android设备作为客户端的基础上,vehicle_sender节点建立基本的TCP/IP通信机制,等待Android设备客户端向车辆服务器端发起通信请求,若请求则把服务器端数据发送给客户端。其中主要包括了main函数、vehicleCmdCallback函数、receiverCaller函数和sendCommand函数。

3.1 main函数

  main函数主要创建了vehicle_sender节点,然后创建sub这个subscriber和回调函数vehicleCmdCallback,随后创建一个线程,创建线程成功后,新创建的线程从指定的起始地址执行线程函数receiverCaller,而原来的线程则继续运行下一行代码,最后通过阻塞函数反复调用队列中可执行的回调函数vehicleCmdCallback。

#include <ros/ros.h>
#include "autoware_msgs/VehicleCmd.h"
#include "autoware_msgs/Gear.h"
#include <iostream>
#include <string>
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>struct CommandData
{double linear_x;double angular_z;int modeValue;int gearValue;int lampValue;int accellValue;int brakeValue;int steerValue;double linear_velocity;double steering_angle;void reset();
};enum class ZMPGear
{Drive = 1,Reverse = 2,Low = 3,Neutral = 4,Park = 5,
};void CommandData::reset()
{linear_x = 0;angular_z = 0;modeValue = 0;gearValue = 0;lampValue = 0;accellValue = 0;brakeValue = 0;steerValue = 0;linear_velocity = -1;steering_angle = 0;
}static CommandData command_data;int main(int argc, char** argv)
{ros::init(argc, argv, "vehicle_sender");ros::NodeHandle nh;std::cout << "vehicle sender" << std::endl;ros::Subscriber sub = nh.subscribe("/vehicle_cmd", 1, vehicleCmdCallback);command_data.reset();pthread_t th;if (pthread_create(&th, nullptr, receiverCaller, nullptr) != 0){std::perror("pthread_create");std::exit(1);}if (pthread_detach(th) != 0){std::perror("pthread_detach");std::exit(1);}ros::spin();//阻塞,反复查看有无可执行的回调函数return 0;
}

3.2 vehicleCmdCallback函数

  vehicleCmdCallback函数主要是定义command_data的内容,这个command_data之后要从服务器端发送给客户端。

static void vehicleCmdCallback(const autoware_msgs::VehicleCmd& msg)
{command_data.linear_x = msg.twist_cmd.twist.linear.x;command_data.angular_z = msg.twist_cmd.twist.angular.z;command_data.modeValue = msg.mode;if (msg.gear_cmd.gear == autoware_msgs::Gear::DRIVE){command_data.gearValue = static_cast<int>(ZMPGear::Drive);}else if (msg.gear_cmd.gear == autoware_msgs::Gear::REVERSE){command_data.gearValue = static_cast<int>(ZMPGear::Reverse);}else if (msg.gear_cmd.gear == autoware_msgs::Gear::LOW){command_data.gearValue = static_cast<int>(ZMPGear::Low);}else if (msg.gear_cmd.gear == autoware_msgs::Gear::NEUTRAL){command_data.gearValue = static_cast<int>(ZMPGear::Neutral);}else if (msg.gear_cmd.gear == autoware_msgs::Gear::PARK){command_data.gearValue = static_cast<int>(ZMPGear::Park);}if (msg.lamp_cmd.l == 0 && msg.lamp_cmd.r == 0){command_data.lampValue = 0;}else if (msg.lamp_cmd.l == 1 && msg.lamp_cmd.r == 0){command_data.lampValue = 1;}else if (msg.lamp_cmd.l == 0 && msg.lamp_cmd.r == 1){command_data.lampValue = 2;}else if (msg.lamp_cmd.l == 1 && msg.lamp_cmd.r == 1){command_data.lampValue = 3;}command_data.accellValue = msg.accel_cmd.accel;command_data.steerValue = msg.steer_cmd.steer;command_data.brakeValue = msg.brake_cmd.brake;command_data.linear_velocity = msg.ctrl_cmd.linear_velocity;command_data.steering_angle = msg.ctrl_cmd.steering_angle;
}

3.3 receiverCaller函数

  receiverCaller函数又创建了一个服务器端的流式套接字,同样通过socket函数创建服务器端的流式套接字,然后使用bind函数将该套接字和指定地址相连接,随后使用listen函数表示服务器已做好准备,可以通信,最后利用accept函数接纳客户端请求并返回客户端套接字标识,并把该标识作为参数传递给线程函数sendCommand。

static void* receiverCaller(void* unused)
{constexpr int listen_port = 10001;int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){std::perror("socket");return nullptr;}sockaddr_in addr;sockaddr_in client;socklen_t len = sizeof(client);std::memset(&addr, 0, sizeof(sockaddr_in));addr.sin_family = PF_INET;addr.sin_port = htons(listen_port);addr.sin_addr.s_addr = INADDR_ANY;int ret = bind(sock, (struct sockaddr*)&addr, sizeof(addr));if (ret == -1){std::perror("bind");goto error;}ret = listen(sock, 20);if (ret == -1){std::perror("listen");goto error;}while (true){// get connect to androidstd::cout << "Waiting access..." << std::endl;int* client_sock = new int();*client_sock = accept(sock, reinterpret_cast<sockaddr*>(&client), &len);if (*client_sock == -1){std::perror("accept");break;}std::cout << "get connect." << std::endl;pthread_t th;if (pthread_create(&th, nullptr, sendCommand, static_cast<void*>(client_sock)) != 0){std::perror("pthread_create");break;}if (pthread_detach(th) != 0){std::perror("pthread_detach");break;}}error:close(sock);return nullptr;
}

3.4 sendCommand函数

  sendCommand函数主要使用write函数把服务器端的数据往客户端写入。

static void* sendCommand(void* arg)
{int* client_sockp = static_cast<int*>(arg);int client_sock = *client_sockp;delete client_sockp;std::ostringstream oss;oss << command_data.linear_x << ",";oss << command_data.angular_z << ",";oss << command_data.modeValue << ",";oss << command_data.gearValue << ",";oss << command_data.accellValue << ",";oss << command_data.brakeValue << ",";oss << command_data.steerValue << ",";oss << command_data.linear_velocity << ",";oss << command_data.steering_angle << ",";oss << command_data.lampValue;std::string cmd(oss.str());ssize_t n = write(client_sock, cmd.c_str(), cmd.size());/*ssize_t write(int filedes, const void *buf, size_t nbytes);返回值:写入文件的字节数(成功);-1(出错)write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。*/if (n < 0){std::perror("write");return nullptr;}if (close(client_sock) == -1){std::perror("close");return nullptr;}std::cout << "cmd: " << cmd << ", size: " << cmd.size() << std::endl;return nullptr;
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. ArduCopter相关

    &#xfeff;&#xfeff;1.ArduPilot_main 我们知道&#xff0c;在 C语言中最经典的程序是 “Hello World!”&#xff0c;这应该是我们在 C语言中最早接触的一个程序了。而在单片机中&#xff0c;最经典的一个程序当属 LED了。那么这里我们为什么不去分析 “Hello World&#…...

    2024/4/23 8:36:04
  2. C++11新特性

    程序员的自我修养_Will.zhang 关注多核计算&高性能计算 目录视图摘要视图订阅 深度学习代码专栏 攒课--我的学习我做主 【hot】直播技术精选 C11 2013-03-11 10:18 11849人阅读 评论(0) 收藏 举报分类&#xff1a;C/C&#xff08;26&#xff09; 目录(?)[] C11…...

    2024/5/8 12:00:17
  3. 全切双眼皮几天以后就不疼了

    ...

    2024/4/21 13:26:31
  4. Navigation源码阅读之move_base

    move_base是小车控制的核心模块&#xff0c;这一块从宏观上调控了整个导航过程。先瞄一眼头文件&#xff1a; typedef actionlib::SimpleActionServer<move_base_msgs::MoveBaseAction> MoveBaseActionServer;enum MoveBaseState{PLANNING,CONTROLLING,CLEARING};enum R…...

    2024/4/21 13:26:29
  5. ★tiny-rate 东半球最小的评级组件☆

    事情来源自我的知乎回答---单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - num, 10 - num); 复制代码简单的评级&#xff0c;由于就是字符&#xff0c;所以支持css定义大小&#xff0c;和颜色&#xff0c;大部分需求用这个是能满足的&#xff0c;但是有些评论…...

    2024/4/21 13:26:29
  6. TypeScript --- 快速学习

    1. typescript是什么Typescript是由微软开发的一款开源的编程语言Typescript是Javascript的超集&#xff0c;遵循最新的ES5/ES6规范。TypeScript扩展了Javascript语法TypeScript更像后端Java、C#这样的面向对象语言可以让JS开发大型企业应用越来越多的项目是基于TS的&#xff0…...

    2024/4/21 13:26:27
  7. ROSNOTE : dynamic reconfigure 动态调参

    本文参考于&#xff1a;https://blog.csdn.net/u014610460/article/details/79531616#commentBox 目前官网给出的例程实现dynamic_reconfigure的客户端只给出了python例程&#xff0c;而服务端给了c和python两种方法的实现。 后来查看了下dynamic_reconfigure的源码&#xff…...

    2024/4/21 13:26:26
  8. apollo-graphql 自己使用的一点姿势

    apollo 能干什么 怎么用(react版) 2.1 引入方式// index.tsx import { LocaleProvider, message } from antd import zhCN from antd/lib/locale-provider/zh_CN; import { InMemoryCache } from apollo-cache-inmemory; import { ApolloClient } from apollo-client import {…...

    2024/5/8 11:32:50
  9. Swagger结合mustache模板生成后台接口代码、以及前后台建模代码

    之前项目中使用的的thrift来建模&#xff0c;维护前后台模型以及rest接口&#xff0c;前台使用的是angular2&#xff1b; 但是使用thrift只能生成建模&#xff0c;后台的rest接口的Controller文件还是需要手动去写&#xff0c;一旦接口改动就会涉及到很多方面。 由此准备使用S…...

    2024/4/21 13:26:25
  10. 才割双眼皮一年了怎么还是不舒服

    ...

    2024/4/21 13:26:24
  11. 【javascript】杂记

    1.settimeout函数是指定毫秒数后调用函数或者是计算表达式的&#xff0c;而settimeout设置为0s&#xff0c;他被js放在队列中&#xff0c;要等别人执行完&#xff0c;他才会执行。 console.log(1); setTimeout(function(){console.log(2);},0); console.log(3);1 3 2 2 . nu…...

    2024/4/21 13:26:22
  12. 松灵机器人Scout代码分析 --- scout_ros

    公司采购了一款室外的四轮差速底盘&#xff0c;正在看通讯的代码。 代码的github: https://github.com/westonrobot/scout_ros scout_base_node.cpp 1. 调用 ScoutBase.h 的 connetc() : 设置通讯方式&#xff08;serial or can &#xff09;并 进行连接 2. scout_base/…...

    2024/4/21 13:26:23
  13. [Javascript] 编程实践之1: Google的Javascript代码风格5:语言特性

    Google的Javascript风格指南5 语言特性5.1 局部变量声明5.1.1 const和let的使用5.1.2 每次只声明一个变量5.1.3 仅在需要时声明&#xff0c;并且尽快初始化5.1.4 根据需要声明类型5.2 数组文法5.2.1 使用拖拽逗号5.2.2 不要使用可变数组的构造函数5.2.3 非数值性质5.2.4 析构5.…...

    2024/4/20 15:57:51
  14. 平行眼割的双眼皮时间久了会成内双吗

    ...

    2024/4/20 15:57:47
  15. 割双眼皮是不是时间越久

    ...

    2024/4/20 15:57:47
  16. 双眼皮宽一点好还是窄一点好看

    ...

    2024/4/20 15:57:46
  17. angular编译出错解决办法Angular Compiler was detected but it was an instance of the wrong class.

    出现如下错误&#xff1a; Module build failed: Error: Angular Compiler was detected but it was an instance of the wrong class. This likely means you have several ngtools/webpack packages installed. You can check this with npm ls ngtools/webpack, and then…...

    2024/5/8 17:03:21
  18. 拉双眼皮要价格多少钱

    ...

    2024/4/20 15:57:43
  19. 拉双眼皮要价格多少钱啊

    ...

    2024/4/29 10:40:44
  20. 刚做完双眼皮如何预防黏连

    ...

    2024/4/20 15:57:41

最新文章

  1. 泛微E9开发 选择项目类型,自动带出该类项目的预计金额(即下拉框联动浮点型数据)

    1、功能背景 在用户进行项目类型选择时&#xff0c;自动带出其余的标准数据&#xff08;样例中的预计金额&#xff09;&#xff0c;如对员工进行表彰奖励时&#xff0c;不同的表彰有不同的奖励金额&#xff0c;那么我们就可以使用以下的方式来进行操作。 2、展示效果 3、实现…...

    2024/5/9 1:52:36
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 汽车统一诊断服务UDS协议参考文章和视频

    UDS基础知识介绍-电子发烧友网 【图解UDS】UDS汽车诊断标准协议&#xff08;ISO14229&#xff09;带你入门到精通-有驾 车载测试之UDS诊断协议9&#xff1a;0x27服务&#xff1a;解锁ECU_哔哩哔哩_bilibili UDS诊断的22服务&#xff08;DID读取数据&#xff09;和2E服务&…...

    2024/5/5 4:34:45
  4. xv6项目开源—05

    xv6项目开源—05.md 理论&#xff1a; 1、设备驱动程序在两种环境中执行代码&#xff1a;上半部分在进程的内核线程中运行&#xff0c;下半部分在中断时执行。上半部分通过系统调用进行调用&#xff0c;如希望设备执行I/O操作的read和write。这段代码可能会要求硬件执行操作&…...

    2024/5/8 1:57:10
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57