Unity3D网络游戏实战——正确收发数据流
前言
本章主要介绍和实现怎样正确和高效地处理TCP数据(数据流)。也解决了上一章我们遇到的一些问题
4.1TCP数据流
4.1.1系统缓冲区
收到对端数据时,操作系统会将数据存入到Socket的接收缓冲区中,而且操作系统层面上的缓冲区完全由操作系统操作,程序并不能直接操作,只能通过socket.Receive、socket.Send方法来间接操作。
注意:之后出现的readBuff不是发送缓冲区也不是接收缓冲区,而是用户自定义的缓冲区,用于存放两个操作系统缓冲区读取出的字节数据。
4.1.2粘包半包现象
粘包:
有时候你想发送两条数据“童立华”和“好帅”,期望其他客户端分别展示这两条数据。但是Receive可能把两条信息当做一条处理,最后显示出来的是“童立华好帅”。这就是粘包现象,因为Receive返回操作系统接收缓冲区中存放的内容。
半包:
当你想发送“童立华颜晓仪是猪”,但是接收端调用Receive的时候,只接收到了“童立华”,等待一小段时间后才接收到了“颜晓仪是猪”。最后就分开显示“童立华”,“颜晓仪是猪”两条数据。
因为TCP是基于流的数据,粘包很正常。但是直觉告诉我们:一次发送多少数据,一次就接收多少数据才正常。
在服务端Accept后用
System.Threading.Thread.Sleep(30*1000);
,并在此期间让客户端多次发送数据,就可以人工复现粘包。
4.3解决粘包问题
- 长度信息法:在每个数据包前加上长度信息,每次收到数据后,先读取表示长度的字节,然后从缓冲区取出相应长度的字节。Int16的范围是0-65535,一般一条消息的长度用Int16就可以了。
- 固定长度法:每次读取固定长度的信息,如果有超出的,就取出然后等下次接收信息后拼接。
- 结束符号法:可以用一个结束符号作为消息间的分隔符。当读取到结束符时如果还有消息,就取出等下次接收信息后拼接。
4.3.1发送数据
如果要发送HelloWorld,用长度信息法来解决。最后发送的就是“0AHelloWorld”。用Linq命名空间下的Concat方法来拼接长度数组和信息数组后发送即可。代码最后呈上。
4.3.2接收数据
核心思想是定义一个缓冲区readBuff和记录缓冲区现在有多少数据的长度变量buffCount。如果缓冲区有未处理的数据,就把新读的数据放在有效数据之后。
4.3.3处理数据
如果缓冲区数据足够长,超过一条消息的长度,就把消息提取出来处理。
如果数据长度不够,就不去处理它,等待下一次接受数据。
- 缓冲区长度小于等于2,那就是不够将长度信息解析出来,就等到下一次接受数据。
- 缓冲区长度大于2,但不足以组成一条消息的时候,比如05hell,就不去处理它,等待下一次接收。
- 缓冲区长度大于等于一条完整消息,就解析出来,然后更新缓冲区,也就是用array.copy()函数将后面的移到前面,因为解析完的缓冲区数据已经没用了。
4.4大端小端问题
粘包半包的问题占据了收发数据问题的80%,大端小端问题就是剩余的20%其中之一。
我们是用
BitConverter.ToInt16()
来将长度标记字节转为Int16的,但是看了它的源码会发现,根据计算机是大端还是小端编码,计算编码方式会有不同。
那么对于不同的计算机,读取出来的数据长度也会有不同!
4.4.1为什么有大端小端之分
总而言之是个历史问题,我就不多赘述了!
4.4.2用Reverse()兼容大小端编码
我们规定使用小端编码,就判断系统是否是小端编码的系统,如果不是就用Reverse()将大端编码转为小端。
if(!BitConverter.IsLittleEndian){lenBytes.Reverse();
}
所以接下来我们都是手动还原前两位数字为Int16,用小端编码的还原形式
Int16 bodyLen = (short)((readBuff[1] << 8) | readBuff[0]);
此处的“|”是逻辑与,等同于位相加。
4.5完整发送数据
简单假设我们操作系统缓冲区为8字节
- 先发送04hero,剩下2字节,网络不好,没法送出去,继续在操作系统的发送缓冲区中
- 再发送03cat,cat写不下,03被写入,被成功发送后,缓冲区为空
- 再发送02hi
- 服务器解析时,0302h就被解析出来了,导致出错
4.5.2如何解决发送不完整问题
在发送前将数据保存起来,如果不完整,在Send回调函数中继续发送没发完的数据,直到把新的数据发完才能让新的数据进入发送缓冲区
防止在调用BeginSend调用回调这个时间段内再次点击发送出现问题,我们用一个写入队列是否为空来判断,**每次只能有一条数据!!!**如果还没发干净,你再点击send也不会把新数据加进缓冲区
4.5.3ByteArray和Queue
ByteArray是什么?因为我们要发送没发完的数据,所以就用ByteArray来封装byte[]、readIdx和length,这样才可以用readIdx作为下标记录上一次发送到哪里,直接取出byte[]对应的位数发送即可。
Queue的好处在于入队出队为O(1),如果是一个数组,那么就需要O(n)的时间复杂度来移动。
4.5.4解决线程冲突
由异步机制可以知道,BeginSend和回调函数执行于不同县城,如果同时操作writeQueue就会出错。比如第二次发送时,第一次发送的回调函数刚好被调用,当第一次出完队之后,再次判断是否要发送,此时第二次发送的东西刚好入队,那么第一次以为是自己没发干净的东西,再发一次。那么第二次又发一次,就将第二次的数据发送了两次。
为了避免线程竞争,可以通过加锁lock的方式处理。当两个线程争夺一个锁的时候,一个线程等待,被组织的那个锁变为可用。
4.6高效的接收数据
4.6.1不足之处
1.Copy操作
O(n)的时间复杂度当然达咩,所以我们用一个ByteArray数组来作为缓冲区,使用readIdx指向缓冲区的第一个数据,每次解析数据后,就将readIdx增加。比如解析了"03cat",就+5,当缓冲区长度不够时,做一次Array.Copy即可。非常舒服。
2.缓冲区不够长
如果网络不好,就会把缓冲区撑爆。当长度不够时,让它自动扩展,重新申请一个较长的bytes数组。
4.6.2完整的ByteArray
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;public class ByteArray
{//默认大小const int DEFAULT_SIZE = 1024;//初始大小int initSize = 0;//用户缓冲区public byte[] bytes;//读写位置public int readIdx = 0;public int writeIdx = 0;//容量private int capacity = 0;//剩余空间public int remain { get { return capacity - writeIdx; } }//数据长度public int length { get { return writeIdx - readIdx; } }//构造函数public ByteArray(byte[] defaultBytes){bytes = defaultBytes;capacity = defaultBytes.Length;initSize = defaultBytes.Length;readIdx = 0;writeIdx = defaultBytes.Length;}//构造函数public ByteArray(int size = DEFAULT_SIZE){bytes = new byte[size];capacity = size;initSize = size;readIdx = 0;writeIdx = 0;}public override string ToString(){return BitConverter.ToString(bytes, readIdx, length);}public string Debug(){return string.Format("readIdx({0}) writeIdx({1}) bytes({2}))", readIdx, writeIdx, BitConverter.ToString(bytes, 0, bytes.Length));}public void Resize(int size){if (size < length) return;if (size < initSize) return;int n = 1;//n是2的倍数,但是大于size!while (n < size) n *= 2;capacity = n;byte[] newBytes = new byte[capacity];Array.Copy(bytes, readIdx, newBytes, 0, writeIdx - readIdx);bytes = newBytes;writeIdx = length;readIdx = 0;}//检查并移动数据,,多点remain,避免bytes过长public void CheckAndMoveBytes(){if(length < 8){MoveBytes();}}//移动数据public void MoveBytes(){if(length > 0){Array.Copy(bytes, readIdx, bytes, 0, length);}writeIdx = length;readIdx = 0;}//写入数据public int Write(byte[] bs,int offst,int count){if(remain < count){Resize(length + count);}Array.Copy(bs, offst, bytes, writeIdx, count);writeIdx += count;return count;}//读取数据public int Read(byte[] bs, int offset, int count){count = Math.Min(count, length);Array.Copy(bytes, readIdx, bs, offset, count);readIdx += count;CheckAndMoveBytes();return count;}//读取Int16public Int16 ReadInt16(){if (length < 2) return 0;Int16 ret = (Int16)((bytes[readIdx + 1] << 8) | bytes[readIdx]);//手动还原readIdx += 2;CheckAndMoveBytes();return ret;}//读取32public Int32 ReadInt32(){if (length < 4) return 0;Int32 ret = (Int32)((bytes[readIdx + 3] << 24) |(bytes[readIdx + 2] << 16) |(bytes[readIdx + 1] << 8) |(bytes[readIdx + 0]));readIdx += 4;//4位读取完毕,移动下标CheckAndMoveBytes();return ret;}
}
4.7客户端代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using UnityEngine.UI;
using System;
using System.Linq;public class Echo : MonoBehaviour
{//定义套接字Socket socket;//UGUIpublic InputField InputField;public Text text;//接收缓冲区byte[] readBuff = new byte[1024];//最新的接收缓冲区ByteArray readBuff1 = new ByteArray();//接收缓冲区的数据长度int buffCount = 0;//显示文字string recvStr = "";bool canSend = false;List<Socket> checkRead = new List<Socket>();//定义发送缓冲区byte[] sendBytes = new byte[1024];//缓冲区偏移值int readIdx = 0;//缓冲区剩余长度int length = 0;Queue<ByteArray> writeQueue = new Queue<ByteArray>();//点击连接按钮public void Connection(){//新建sockect//地址族IPV4,套接字类型stream,协议类型socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//connect//远程IP地址,远程端口,阻塞方法,卡住直到服务端回应、//自己建立服务器的话,ip地址和端口号就是这两个socket.Connect("127.0.0.1", 8888);//如果是异步就在callback里接收,同步就直接接收socket.BeginReceive(readBuff1.bytes, readBuff1.writeIdx, readBuff1.remain, 0, ReceiveCallback, socket);//异步//socket.BeginConnect("127.0.0.1", 8888, ConnectCallback, socket);}//Connect回调public void ConnectCallback(IAsyncResult ar){try{//此socket可由ar.AsyncState获取到Socket socket = (Socket)ar.AsyncState;socket.EndConnect(ar);Debug.Log("Socket Connect Succ");//接收缓冲区、0表示从readBuff第0位开始接收数据(和TCP粘包问题有关)、每次最多接收1024字节数据(即使服务器发送1025,也只接收1024)//接收函数调用时机:在连接成功后就开始接受数据,接收到数据后,回调函数ReceiveCallback被调用socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);}catch (SocketException ex){Debug.Log("Socket Connect fail" + ex.ToString());}}//Receive回调public void ReceiveCallback(IAsyncResult ar){try{Socket socket = (Socket)ar.AsyncState;//获取接收到的数据长度,并更新缓冲区的数据长度int count = socket.EndReceive(ar);readBuff1.writeIdx += count;//处理二进制消息OnReceiveData();//用了专门的处理函数就不需要了//string s = System.Text.Encoding.Default.GetString(readBuff, 0, count);//recvStr = s + "\n" + recvStr;//等待,模拟粘包//System.Threading.Thread.Sleep(1000 * 30);//接收完一串数据后,等待下一串数据的到来if(readBuff1.remain < 8){readBuff1.MoveBytes();readBuff1.Resize(readBuff1.length * 2);}socket.BeginReceive(readBuff1.bytes, readBuff1.writeIdx, readBuff1.remain, 0, ReceiveCallback, socket);}catch (SocketException ex){Debug.Log("Socket Receive fail" + ex.ToString());}}public void OnReceiveData(){Debug.Log("[Recv 1] buffCount=" + readBuff1.length);Debug.Log("[Recv 2] readbuff=" + readBuff1.ToString());//消息长度if (readBuff1.length <= 2) return;int readIdx = readBuff1.readIdx;byte[] bytes = readBuff1.bytes;Int16 bodyLength = (Int16)((bytes[readIdx + 1] << 8)|bytes[readIdx]);//手动以小端形式来还原if (readBuff1.length < 2 + bodyLength) return;readBuff1.readIdx += 2;Debug.Log("[Recv 3] bodyLength=" + bodyLength);//消息体byte[] stringByte = new byte[bodyLength];readBuff1.Read(stringByte, 0, bodyLength);string s = System.Text.Encoding.UTF8.GetString(stringByte);Debug.Log("[Recv 4] s=" + s);//更新缓冲区//int start = 2 + bodyLength;//int count = buffCount - start;//Array.Copy(readBuff, start, readBuff, 0, count);//buffCount -= start;Debug.Log("[Recv 5] readbuff=" + readBuff1.ToString());//更新后的buffcount//消息处理recvStr = s + '\n' + recvStr;//继续读取if (readBuff1.length > 2){OnReceiveData();}}//点击发送按钮public void Send(){//send//if (canSend)//{// string sendStr = InputField.text;// //string sendStr = System.DateTime.Now.ToString();// //将str转化为字节流// byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);// //socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket);// socket.Send(sendBytes);//}//异步不需要receive//Recv//byte[] readBuff = new byte[1024];接收数据的长度//int count = socket.Receive(readBuff);//string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);//text.text = recvStr;Close//socket.Close();string sendStr = InputField.text;//组装协议byte[] bodyBytes = System.Text.Encoding.Default.GetBytes(sendStr);Int16 len = (Int16)bodyBytes.Length;byte[] lenBytes = BitConverter.GetBytes(len);//大小端编码if (!BitConverter.IsLittleEndian){Debug.Log("[Send] Reverse lenBytes");lenBytes.Reverse();}byte[] sendBytes = lenBytes.Concat(bodyBytes).ToArray();//现在开始用ByteArray来封装这些数据//length = sendBytes.Length;//数据长度//readIdx = 0;方便:同步、不抛异常//socket.BeginSend(sendBytes, readIdx, length, 0, SendCallback, socket);//Debug.Log("[Send]" + BitConverter.ToString(sendBytes));ByteArray ba = new ByteArray(sendBytes);int count = 0;//加锁,只有一个线程可以操作lock (writeQueue){writeQueue.Enqueue(ba);count = writeQueue.Count;}//一定要把前面的发完,只剩下当前要发送的才发送if(count == 1){socket.BeginSend(ba.bytes, ba.readIdx, ba.length, 0, SendCallback, socket);}}//Send回调public void SendCallback(IAsyncResult ar){try{//这个socket是传进回调的用户定义对象,可强转为socketSocket socket = (Socket)ar.AsyncState;int count = socket.EndSend(ar);//判断是否发送完整ByteArray ba;//加锁!lock (writeQueue){ba = writeQueue.First();}//每次加上发送的长度,看看end - start = length是否为0,为0证明发完就可以弹出ba.readIdx += count;if (ba.length == 0){//只要是取first的都要加锁!lock (writeQueue){//如果剩余长度为0,证明发送完整了writeQueue.Dequeue();ba = writeQueue.First();}}//但是如果发送不完整,是不是会收到一条完整的和一条不完整的?//不是,会先发出一段,再发出后半段。因为readIdx也就是start在变if(ba != null){//如果发送不完整或者发送完整且存在第二条数据socket.BeginSend(ba.bytes, ba.readIdx, ba.length, 0, SendCallback, socket);}Debug.Log("Socket Send succ" + count);}catch(SocketException ex){Debug.Log("Socket Send fail" + ex.ToString());}}public void Update(){//if(socket == null)//{// return;//}poll客户端//if (socket.Poll(0, SelectMode.SelectRead))//{// byte[] readBuff = new byte[1024];// int count = socket.Receive(readBuff);// //不阻塞模式,microSeconds=0// string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);// text.text = recvStr;//}处理阻塞send应该也差不多//if (socket.Poll(0, SelectMode.SelectWrite))//{// canSend = true;//}//else//{// canSend = false;//}select客户端只需检测一个socket,将这个socket加入到待监测列表即可//checkRead.Clear();//checkRead.Add(socket);select//Socket.Select(checkRead, null, null, 0);check//foreach (Socket s in checkRead)//{// byte[] readBuff = new byte[1024];// int count = socket.Receive(readBuff);// string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);// text.text = recvStr;//}text.text = recvStr;}
}
4.8服务端代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;//hhpublic class ClientState
{public Socket socket;public byte[] readBuff = new byte[1024];public int hp = -100;public float x = 0;public float y = 0;public float z = 0;public float eulY = 0;
}
class MainClass
{//异步服务器//监听Socketstatic Socket listenfd;//客户端Socket及状态信息public static Dictionary<Socket, ClientState> clients = new Dictionary<Socket, ClientState>();public static void Main(string[] args){Console.WriteLine("Hello");//SocketSocket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//BindIPAddress ipAdr = IPAddress.Parse("127.0.0.1");//IP地址IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);//IP和端口//给listenfd套接字绑定IP和端口,"127.0.0.1"地址和8888号端口listenfd.Bind(ipEp);//Listen,等待客户端连接//0表示容纳等待接收的客户端连接数不受限制,1代表最多可容纳等待接受的连接数为1listenfd.Listen(0);Console.WriteLine("[服务器]启动成功");//同步服务器//while (true)//{// //Accept// //接收客户端连接,均为阻塞方法,如果没有客户端连接就不会向下执行// //返回一个新客户端的socket对象,对于服务器来说// //它有一个监听 Socket(listenfd)用来监听和应答客户端的连接,对每个客户端还有专门一个socket(connfd)用于处理客户端的数据// Socket connfd = listenfd.Accept();// Console.WriteLine("[服务器]Accetp");// //Receive// byte[] readBuff = new byte[1024];// int count = connfd.Receive(readBuff);// string readStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);// Console.WriteLine("[服务器接收]" + readStr);// //Send// byte[] sendBytes = System.Text.Encoding.Default.GetBytes(readStr);// //如果客户端用异步,即使收不到服务端的消息也不会卡住主线程// connfd.Send(sendBytes);//}//异步服务器//listenfd.BeginAccept(AcceptCallback, listenfd);等待//Console.ReadLine();阻塞poll服务器//while (true)//{// //检查listenfd,可读就添加客户端信息// if (listenfd.Poll(0, SelectMode.SelectRead))// {// ReadListenfd(listenfd);// }// //检查clientfd// foreach (ClientState s in clients.Values)// {// Socket clientfd = s.socket;// if (clientfd.Poll(0, SelectMode.SelectRead))// {// //false表示客户端断开(收到长度为0的数据)// //断开会删掉列表中对应的信息,导致遍历失败,所以直接break// if (!ReadClientfd(clientfd))// {// break;// }// }// }// //防止CPU占用过高// //让程序挂起1ms,避免死循环让CPU喘息// System.Threading.Thread.Sleep(1);//}//select服务器//checkReadList<Socket> checkRead = new List<Socket>();//主循环while (true){//填充checkRead列表checkRead.Clear();checkRead.Add(listenfd);foreach (ClientState s in clients.Values){checkRead.Add(s.socket);}//select,只将待检查可读的列表传进去Socket.Select(checkRead, null, null, 1000);//调用完上面的方法后这个列表就被改了,这个列表中只有可读的socketforeach (Socket s in checkRead){//因为listnfd本身就被加进去了if (s == listenfd){ReadListenfd(s);}//除了listen其余都是可读的客户端,直接处理即可else{ReadClientfd(s);}}}
}//读取listenfd,和一步服务端的acceptcallback相似,用于应答客户端,添加客户端信息public static void ReadListenfd(Socket listenfd){Console.WriteLine("Accept");Socket clientfd = listenfd.Accept();ClientState state = new ClientState();state.socket = clientfd;clients.Add(clientfd, state);}//和异步服务端的Receivecallback类似,用于接收客户端消息,并广播给所有客户端public static bool ReadClientfd(Socket clientfd){ClientState state = clients[clientfd];//接收int count = 0;try{count = clientfd.Receive(state.readBuff);}catch(SocketException ex){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Receive SocketException" + ex.ToString());return false;}//让客户端关闭if(count == 0){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Socket Close");return false;}//广播//enter|和list|一起到了怎么拆分,因为是同一个客户端发过来的,都在readbuff里string recvStr = System.Text.Encoding.Default.GetString(state.readBuff, 2, count-2);Console.WriteLine("Receive" + recvStr);byte[] sendBytes = new byte[count];Array.Copy(state.readBuff, 0, sendBytes, 0, count);foreach (ClientState cs in clients.Values){cs.socket.Send(sendBytes);}return true;}//Accept回调//是beginaccept的回调函数,处理3件事//1.给新的连接分配ClientState,并把它加入到clients列表中//2.异步接收客户端数据//3.再次调用BeginAccept循环public static void AcceptCallback(IAsyncResult ar){try{Console.WriteLine("[服务器]Accept");//监听和应答客户端的socketSocket listenfd = (Socket)ar.AsyncState;//处理该客户端的socketSocket clientfd = listenfd.EndAccept(ar);//clients列表ClientState state = new ClientState();//初始化此客户端类,key和value岂不是重复利用了?state.socket = clientfd;clients.Add(clientfd, state);//接收数据BeginReceive,以ClientState取代Socketclientfd.BeginReceive(state.readBuff, 0, 1024, 0, ReceiveCallback, state);//继续Acceptlistenfd.BeginAccept(AcceptCallback, listenfd);}catch(SocketException ex){Console.WriteLine("Socket Accept fail" + ex.ToString());}}//Receive回调//1.服务端收到消息后,回应客户端//2.如果收到客户端关闭连接的信号"if(count==0)",断开连接//3.继续调用BeginReceive接收下一个数据public static void ReceiveCallback(IAsyncResult ar){try{//发送消息的客户端ClientState state = (ClientState)ar.AsyncState;Socket clientfd = state.socket;//当receive返回值小于等于0时,表示socket连接可以断开int count = clientfd.EndReceive(ar);//客户端关闭if(count == 0){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Socket Close");return;}//从收到的字节流转为stringstring recvStr = System.Text.Encoding.Default.GetString(state.readBuff, 0, count);string sendStr = clientfd.RemoteEndPoint.ToString() + ":" + recvStr;byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);//string转为bytes//用于处理该客户端数据的socketforeach(ClientState s in clients.Values){s.socket.Send(sendBytes);}clientfd.BeginReceive(state.readBuff, 0, 1024, 0, ReceiveCallback, state);}catch(SocketException ex){Console.WriteLine("Socket Receive fail" + ex.ToString());}}public static void Send(ClientState cs,string sendStr){byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);cs.socket.Send(sendBytes);}
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 2021-11-03论文阅读:Deep Learning for Sensor-Based Rehabilitation Exercise Recognition and Evaluation
摘要 本文提出了一种利用传感器数据进行康复训练识别的多路径卷积神经网络(MP-CNN)。将D-CNN和S-CNN相结合,形成MP-CNN。为了对康复训练进行评价,提出了一个特殊的评价矩阵,并结合深度学习分类器来学习不同层次的各类康复训练的一般特征表示…...
2024/4/15 3:48:32 - 【力扣】421. 数组中两个数的最大异或值
题目: 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。 进阶:你可以在 O(n) 的时间解决这个问题吗? 示例 1: 输入:nums [3,10,5,25,2,8] 输出…...
2024/4/27 12:37:17 - Vue基本概述
基本概述1.vue介绍2.vue基本使用3.vue生命周期1.vue介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。 Vue 的核心库只关注视图层,不仅易于上手&…...
2024/4/17 17:22:50 - 小猪的碎碎碎念
要找到自己喜欢的行业岗位!这样试错成本就会降低! 假如行业是自己喜欢的,但是岗位不那么契合,那可以在自己喜欢的行业里面换岗位,行业经验已经可以使用; 假如行业不是自己喜欢的,但是很喜欢这个…...
2024/4/20 17:06:49 - apt update报错“Unsupported proxy configured“解决办法
我在/etc/apt/apt.conf.d文件夹下已经添加了代理文件10proxy,内容如下: 为了解决上述问题,我把10proxy里面的内容修改为如下 即增加了http://,然后就正常了。 以前不加http://没有报错,不知道换了一台服务器就开始报错了ÿ…...
2024/4/15 3:49:13 - Git常用命令集锦
把自己平时遇到的一些命令记录在这里作为备份 1、恢复已经commit&push的被误删除的文件 用下边这个命令查看包含删除的log git log --diff-filterD --summary 找到对应的提交后运行以下命令$commit为log对应的哈希值, git checkout $commit~1 path/to/file.e…...
2024/4/27 8:43:48 - Unity3D开发Android游戏(二)Hello world
在设置好开发环境后,我们开始编写一个最简单的程序,也就是hello world,并让它在手机上跑起来。 1,建立项目 (1)新建一个空项目。 (2)新建一个2D背景,用于衬托UI &#x…...
2024/4/24 0:29:01 - 什么是MTTF、MTBF、MTRF
什么是MTTF、MTBF、MTRF MTTF 定义为随机变量、出错时间等的"期望值"。但是,MTTF经常被错误地理解为,“能保证的最短的生命周期”。MTTF 的长短,通常与使用周期中的产品有关,其中不包括老化失效。 MTBF 定义为&#x…...
2024/4/19 1:12:11 - 线性表的基本操作
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #define MAXSIZE 10 #define ALPHA 20typedef struct{char name[ALPHA];int n; }Item;typedef struct{Item *item; //指向数据的指针 int len; //个数 }List;v…...
2024/4/15 3:49:08 - 日记:不使用vue脚手架创建组件
丢个代码块自己体会一下: 注意事项,组件声明要在绑定dom节点之前。 v-cloak是为了防止还没有读取到数据之前显示{{xxx}},网上有文章。 万事开头难,引你们入门接下来继续去看官网文档吧!相信你会有更深的体会。 vue.js…...
2024/4/25 13:22:58 - java面试题大合集(开发者必看)
前言本文来自百度网络的一篇文章,由于没有答案,现在整理了一些比较好的回答和好的博客,可以自己扩展思路,如果大家有一下面试题的更好的答案,欢迎在评论区留言。以上全部来自网络!此外,我的微信公众号将每日分享下面面试题相关的知识点总结干货,欢迎关注微信公众号:好…...
2024/4/27 3:42:51 - R——ployroot函数求解多项式方程
R中帮助文件对“ployroot”的解释是“Find zeros of a real or complex polynomial”,翻译过来是“多项式系数递增的向量”。可能有些抽象,下面用几个例子帮助大家理解ployroot函数的用法。 我们设要求解的方程为x2(x的平方)2x10,按照x的次数由小到大进行…...
2024/4/20 2:16:06 - 实验8-1-3 拆分实数的整数与小数部分 (15 分)
本题要求实现一个拆分实数的整数与小数部分的简单函数。 函数接口定义: void splitfloat( float x, int *intpart, float *fracpart ); 其中x是被拆分的实数(0≤x<10000),*intpart和*fracpart分别是将实数x拆分出来的整数部…...
2024/4/21 0:24:25 - C# 编写一个程序,引发一个IndexOutOfRangeException异常,并捕捉处理。
编写一个程序,引发一个IndexOutOfRangeException异常,并捕捉处理。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace solution_8 {class Program{static void Main(st…...
2024/4/18 11:29:17 - 强化学习opf
策略、奖励、评价、环境。 系统:Agent、环境。Agent 由三个模块组成:输入模块 I、强化模块 R 和策略模块 P RS<S,A,W> S(s1,s2,…sN)为环境所有可能状态的集合;A(a1,a2,…aN)是 Agent 可能产生的动作集合;W 是环境的状态转…...
2024/4/26 14:26:15 - 文本在div中水平垂直居中
文本在div中水平垂直居中 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>html,body{height: 100%;}#div1{border: 12px solid green;height: 100%;width: 100%;dis…...
2024/4/25 15:26:49 - uniapp中的全选多选实例( checkbox )
checkbox-group 多项选择器,内部由多个 checkbox 组成。 属性说明 属性名类型默认值说明changeEventHandle<checkbox-group>中选中项发生改变是触发 change 事件,detail {value:[选中的checkbox的value的数组]} checkbox 多选项目。 属性说 …...
2024/4/26 17:37:37 - 毫无基础的人如何快速学习CAD
毕竟,追求极速只不过是寻找捷径而已。关键在于方法。对于一个从未在学校系统地学习 cad 并且必须与之合作的新手来说,他一定经常感到茫然。其实大可不必,不管软件有多先进,它也是为人服务的。只要找到合适的方法,学习软…...
2024/4/26 1:20:03 - 【python函数】np.tile()函数用法解析
np.tile(A,reps){np.tile(A,reps)}np.tile(A,reps)函数可对输入的数组,元组或列表进行重复构造,其输出是数组 该函数有两个参数: A{A}A:输入的数组,元组或列表 reps{reps}reps:重复构造的形状&…...
2024/4/26 4:39:20 - 信号归一化功率_Massive MIMO中基于统计信道的波束形成和功率分配[转载]
随着人们对于信息传输速率日益增长的需求, 大规模多输入多输出系统(Massive MIMO)技术应运而生,成为下一代无线通信的关键技术之一[1]。相比于传统的MIMO系统,Massive MIMO中基站配置的天线数目多达上百甚至至上千根,天线数目的增…...
2024/4/20 13:59:27
最新文章
- 生成完美口型同步的 AI 代言人视频(及其实现原理详解)
目录 什么是Heygen? Heygen注册 Video Translation(视频翻译 完美口型同步) 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具,可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…...
2024/4/28 4:45:36 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - yolov9直接调用zed相机实现三维测距(python)
yolov9直接调用zed相机实现三维测距(python) 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1. yolov4直接调用zed相机实现三维测…...
2024/4/28 3:06:36 - 【python】Flask Web框架
文章目录 WSGI(Web服务器网关接口)示例Web应用程序Web框架Flask框架创建项目安装Flask创建一个基本的 Flask 应用程序调试模式路由添加变量构造URLHTTP方法静态文件模板—— Jinja2模板文件(Template File)<...
2024/4/26 19:47:13 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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