精华内容
下载资源
问答
  • opencv改变imshow窗口大小,窗口位置,ROI

    万次阅读 多人点赞 2017-01-24 23:16:03
    直线检测: cv2.HoughLinesP cv2.namedWindow("enhanced",0); cv2.resizeWindow("enhanced", 640, 480);...创建窗口时候改变下参数就可以鼠标随意拖动窗口改变大小啦 cv::namedWindow("ca...

    11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进步,关注我,给你分享更多干货知识!

    c++:

    
    创建窗口时候改变下参数就可以鼠标随意拖动窗口改变大小啦
    
    cv::namedWindow("camera", CV_WINDOW_NORMAL);//CV_WINDOW_NORMAL就是0
    cv::imshow("camera", frame);

    python: 

    改变大小:

    
    imgpath=r"d:/20200708002140.jpg"
    width=1200
    height=800
    img=cv2.imread(imgpath)
    cv2.namedWindow(imgpath, 0);
    cv2.resizeWindow(imgpath, int(width * (height - 80) / height), height - 80);
    cv2.imshow(imgpath, img)
    cv2.waitKey()
    
    

     

    移动位置

    imgpath=r"d:/20200708002140.jpg"
    width=1200
    height=800
    
    img=cv2.imread(imgpath)
    
    cv2.namedWindow('image', cv2.WINDOW_NORMAL)
    # 改变窗口位置:left top
    
    cv2.moveWindow("image", 1000, 100)
    
    #改变窗口位置:left top
    
    cv2.imshow("image", img)
    cv2.waitKey()

     

    选取矩形ROI

        OpenCV自带 API 可直接选择矩形区域作为ROI,该API位于目标追踪模块,主要是cv2.selectROI()函数。

    import cv2
    
    import imutils
    
    
    img = cv2.imread("./test_image.jpg")
    
    img = imutils.resize(img, width=500)
    
    
    roi = cv2.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
    
    x, y, w, h = roi
    
    
    cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
    
    cv2.imshow("roi", img)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()

    选取多边形ROI

        多边形ROI,主要利用鼠标交互进行绘制:

       1. 单击左键,选择多边形的点;

       2. 单击右键,删除最近一次选择的点;

       3. 单击中键,确定ROI区域并可视化。

       4. 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中。

     

    import cv2
    
    import imutils
    
    import numpy as np
    
    import joblib
    
    
    pts = [] # 用于存放点
    
    
    
    # 统一的:mouse callback function
    
    def draw_roi(event, x, y, flags, param):
    
    img2 = img.copy()
    
    
    if event == cv2.EVENT_LBUTTONDOWN: # 左键点击,选择点
    
    pts.append((x, y))
    
    
    if event == cv2.EVENT_RBUTTONDOWN: # 右键点击,取消最近一次选择的点
    
    pts.pop()
    
    
    if event == cv2.EVENT_MBUTTONDOWN: # 中键绘制轮廓
    
    mask = np.zeros(img.shape, np.uint8)
    
    points = np.array(pts, np.int32)
    
    points = points.reshape((-1, 1, 2))
    
    # 画多边形
    
    mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)
    
    mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255)) # 用于求 ROI
    
    mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0)) # 用于 显示在桌面的图像
    
    
    show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)
    
    
    cv2.imshow("mask", mask2)
    
    cv2.imshow("show_img", show_image)
    
    
    ROI = cv2.bitwise_and(mask2, img)
    
    cv2.imshow("ROI", ROI)
    
    cv2.waitKey(0)
    
    
    if len(pts) > 0:
    
    # 将pts中的最后一点画出来
    
    cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)
    
    
    if len(pts) > 1:
    
    # 画线
    
    for i in range(len(pts) - 1):
    
    cv2.circle(img2, pts[i], 5, (0, 0, 255), -1) # x ,y 为鼠标点击地方的坐标
    
    cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)
    
    
    cv2.imshow('image', img2)
    
    
    
    # 创建图像与窗口并将窗口与回调函数绑定
    
    img = cv2.imread("./test_image.jpg")
    
    img = imutils.resize(img, width=500)
    
    cv2.namedWindow('image')
    
    cv2.setMouseCallback('image', draw_roi)
    
    print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
    
    print("[INFO] 按‘S’确定选择区域并保存")
    
    print("[INFO] 按 ESC 退出")
    
    
    while True:
    
    key = cv2.waitKey(1) & 0xFF
    
    if key == 27:
    
    break
    
    if key == ord("s"):
    
    saved_data = {
    
    "ROI": pts
    
    }
    
    joblib.dump(value=saved_data, filename="config.pkl")
    
    print("[INFO] ROI坐标已保存到本地.")
    
    break
    
    cv2.destroyAllWindows()

     

    展开全文
  • python操作Windows窗口程序

    万次阅读 多人点赞 2018-03-16 17:23:09
    场景 定时获取数据接口数据写入Excel表格,Excel需要被其他程序使用,需要...其次,为了方面查找目标窗口的句柄,可以下载一个微软自家的Spy++,这玩意儿满大街都是。有了它,还能很方便的查看窗体的消息。 句柄是...

    想要看更加舒服的排版、更加准时的推送
    关注公众号“不太灵光的程序员”
    每日八点有干货推送

    场景

    定时获取数据接口数据写入Excel表格,Excel需要被其他程序使用,需要处于开启状态。

    Pywin32

    首先,安装一个Pywin32,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。其次,为了方面查找目标窗口的句柄,可以下载一个微软自家的Spy++,这玩意儿满大街都是。有了它,还能很方便的查看窗体的消息。
    句柄是一个32位整数,在windows中标记对象用,类似一个dict中的key。
    消息是windows应用的重要部分,用来告诉窗体“发生了什么”,比如给一个按钮发送BN_CLICKED这么个消息,按钮就知道“哦,我被点了”,才能执行相应的下一步操作。本文将大量使用消息机制。详情参看这篇文章。

    查找窗体句柄

    貌似在win32编程的世界里,包括窗口到文本框的所有控件就是窗体,所有的窗体都有独立的句柄。要操作任意一个窗体,你都需要找到这个窗体的句柄,这里,我们就可以用到FindWindow函数和FindWindowEx函数。在pywin32中,他们都属于win32gui的模块。
    python获取窗口句柄

    FindWindow(lpClassName=None, lpWindowName=None):

    描述:自顶层窗口(也就是桌面)开始搜索条件匹配的窗体,并返回这个窗体的句柄。不搜索子窗口、不区分大小写。找不到就返回0
    参数:
    lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
    lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
    说明:这个函数我们仅能用来找主窗口。
    ####FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None);
    描述:搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。不区分大小写,找不到就返回0。
    参数:
    hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。
    hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。
    lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
    lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
    说明:找到了主窗口以后就靠它来定位子窗体啦。

    菜单操作

    有了句柄,我们就可以操作FaceGen了!嗯,要先打开文件,File→Open,然后再File→Save Image(很悲剧,Save Image没有快捷键,所以不得不进行菜单操作)。现在我们有了FindWindow和FindWindowEx,要怎么操作菜单呢?

    哦,抱歉,靠他俩还做不到。

    窗口的菜单就像窗口的标题栏一样,是窗口自身的一部分,不是其他窗体控件,也就没有办法用FindWindow和FindWindowEx返回句柄。所以要对菜单进行操作的话,我们需要新的函数,也就是GetMenu,GetSubMenu和GetMenuItemID,它们也都属于win32gui模块。结合下图来说:

    PostMessage(hWnd, Msg, wParam, lParam)

    描述:在消息队列中加入为指定的窗体加入一条消息,并马上返回,不等待线程对消息的处理。
    参数:
    hWnd:整型,接收消息的窗体句柄
    Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)
    wParam:整型,消息的wParam参数
    lParam:整型,消息的lParam参数
    说明:简单说,就是给指定程序发一个消息,这些消息都用整型编好号,作为windows的常量可以查询的。在这里,我们用的就是win32con这个库里定义的WM_COMMAND这个消息,具体的wParam和lParam是根据消息的不同而不同的。具体请根据MSDN查阅。

    GetMenu(hwnd)

    描述:获取窗口的菜单句柄。
    参数:
    hwnd:整型,需要获取菜单的窗口的句柄。
    说明:获取的是插图中黄色的部分。

    GetSubMenu(hMenu, nPos)

    描述:获取菜单的下拉菜单或者子菜单。
    参数:
    hMenu:整型,菜单的句柄,从GetMenu获得。
    nPos:整型,下拉菜单或子菜单的的索引,从0算起。
    说明:这个可以获取插图中蓝色的部分;如描述所述,这个不仅可以获取本例中的下拉菜单,还可以获取子菜单。

    GetMenuItemID(hMenu, nPos)

    描述:获取菜单中特定项目的标识符。
    参数:
    hMenu:整型,包含所需菜单项的菜单句柄,从GetSubMenu获得。
    nPos:整型,菜单项的索引,从0算起。
    说明:这个获取的就是红色区域中的项目啦,注意,分隔符是被编入索引的,所以Open的索引是2而非1,而Exit的索引是9而非6。

    控件操作

    在这里,我们用了SendMessage而不是PostMessage,其区别就在于我们可以通过SendMessage取得消息的返回信息。因为对于我们要设置文本框信息的WM_SETTEXT信息来说,设置成功将返回True。

    SendMessage(hWnd, Msg, wParam, lParam)

    描述:在消息队列中加入为指定的窗体加入一条消息,直到窗体处理完信息才返回。
    参数:
    hWnd:整型,接收消息的窗体句柄
    Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages)
    wParam:整型,消息的wParam参数
    lParam:整型,消息的lParam参数
    说明:wParam和IParam根据具体的消息不同而有不同的定义,详情参阅Part 2.

    问题

    在开发机器上是可以正常运行的,但是换在其他机器上就会报1400的错误

    盐池数据同步已开启 >> 西部绿谷数据.xls
    盐池数据本次同步已完成 时间 2018-03-16 14:34:01  数据60分钟后更新 >> 西部绿谷数据.xls
    Traceback (most recent call last):
      File "data_acquisition_3600.py", line 414, in <module>
    pywintypes.error: (1400, 'CloseWindow', '\xce\xde\xd0\xa7\xb5\xc4\xb4\xb0\xbf\xda\xbe\xe4\xb1\xfa\xa1\xa3')
    Failed to execute script data_acquisition_3600
    

    pywintypes.error 1400 开始以为是编码问题,发现还是找不到窗口句柄,后来发现获取窗口句柄和进程中的名字有关,不同版本的操作系统、Excel的窗口名称和进程名都不一致,需要特别注意。

    进程名

    这里写图片描述

    窗口名

    这里写图片描述

    代码

    # -*- coding:utf-8 -*-
    """
    Created on 2018/3/12
    
    @author: jj
    """
    import urllib
    import json
    import xlwt
    import copy
    import time
    import os
    import win32gui
    import win32con
    
    def write_ex(data):
        """
        数据 写 文件
        :param data:
        :return:
        """
        file = xlwt.Workbook(encoding='utf-8')
        table = file.add_sheet("sheet1")
        params = ['类型', '项目名称', '设备编号', '阀门开关', '泵1开关', '泵2开关', '水位', '上报时间', '水池大小', '管径']
        params_code = ['leixing', 'name', 'code', 'famen', 'ben1', 'ben2', 'shuiwei', 'date', 'daxiao', 'guanjing']
        for index, item in enumerate(params):
            table.write(0, index, item)
        table.write(0, 10, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
        for l_index, equipment in enumerate(data):
            for j_index, item in enumerate(params_code):
                table.write(l_index+1, j_index, equipment.get(item))
        filename = u"西部绿谷数据.xls"
        file_path = os.path.join(filename)
        file.save(file_path)
    
    if __name__ == '__main__':
        print u'盐池数据同步已开启 >> 西部绿谷数据.xls'
        while True:
            get_api()
            print u'盐池数据本次同步已完成 时间 %s  数据5分钟后更新 >> 西部绿谷数据.xls' % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
            os.startfile(u"西部绿谷数据.xls")   # 打开文件
            wndtitle = u"西部绿谷数据.xls  [兼容模式] - Excel"   # 进程名
            wndclass = None
            wnd = win32gui.FindWindow(wndclass, wndtitle)    # 获取窗口句柄
            win32gui.CloseWindow(wnd)      # 窗口最小化
            time.sleep(300)
            win32gui.SendMessage(wnd, win32con.WM_CLOSE)   # 关闭窗口
    

    推荐阅读:

    展开全文
  • TCP的滑动窗口与拥塞窗口

    万次阅读 多人点赞 2018-03-18 01:22:52
    因此我们先了解一下16位的窗口大小究竟有什么作用。 窗口分为滑动窗口和拥塞窗口。 滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的...

    因此我们先了解一下16位的窗口大小究竟有什么作用。

    窗口分为滑动窗口和拥塞窗口。

    滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。

    那么对于数据的发送端就是拥塞窗口了,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包

    一、滑动窗口

    滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度,不过如果接收端的缓冲区一旦面临数据溢出,窗口大小值也会随之被设置一个更小的值通知给发送端,从而控制数据发送量(发送端会根据接收端指示,进行流量控制)。

    对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息:

    一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接 收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是 2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。

     

    二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n).这就是滑动窗口控制流量的基本原理.

    滑动窗口协议如图所示:

    在这个图中,我们将字节从1至11进行 标号。接收方通告的窗口称为提出的窗口,它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。我们知 道窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两 个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:

    • 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。
    • 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了T C P的接收缓存时。
    • 当右边缘向左移动时,称之为窗口收缩。

    当接收端的缓冲区满了,发送端接收到接收端的窗口大小为0,这个时候停止发送数据,这个时候发送端会过了超时重发的时间,发送一个窗口探测的包,此数据端仅含一个字节以获取最新的窗口大小信息

    二、拥塞窗口

     拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

        流量控制:指点对点通信量的控制,是端到端正的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

        拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。

    2. 几种拥塞控制方法

        慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。

    2.1 慢开始和拥塞避免

        发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞。

        发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

        慢开始算法:当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。

    每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。

    另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。

        为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:

        当 cwnd < ssthresh 时,使用上述的慢开始算法。

        当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

        当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

    拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

        无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

        如下图,用具体数值说明了上述拥塞控制的过程。现在发送窗口的大小和拥塞窗口一样大。

    <1>. 当TCP连接进行初始化时,把拥塞窗口cwnd置为1。前面已说过,为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。慢开始门限的初始值设置为16个报文段,即 cwnd = 16 。

    <2>. 在执行慢开始算法时,拥塞窗口 cwnd 的初始值为1。以后发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值另1,然后开始下一轮的传输(图中横坐标为传输轮次)。因此拥塞窗口cwnd 随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(即当cwnd=16时),就改为执行拥塞控制算法,拥塞窗口按线 性规律增长。

    <3>. 假定拥塞窗口的数值增长到24时,网络出现超时(这很可能就是网络发生拥塞了)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值 24的一半),拥塞窗口再重新设置为1,并执行慢开始算法。当cwnd=ssthresh=12时改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过 一个往返时间增加一个MSS的大小。

    强调:“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

    2.2 快重传和快恢复

        如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。

       

    当收到对一个报文的三个重复的 ACK 时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认;

        与快重传配合使用的还有快恢复算法,其过程有以下两个要点:

        <1>. 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。

        <2>. 由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

        下图给出了快重传和快恢复的示意图,并标明了“TCP Reno版本”。

        区别:新的 TCP Reno 版本在快重传之后采用快恢复算法而不是采用慢开始算法。

    快重传和快恢复

    说明:新的 TCP Reno 版本在快重传之后采用快恢复算法而不是采用慢启动算法。从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口rwind 。

    也有的快重传实现是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3 X MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络 的资源而是停留在接收方的缓存中。可见现在网络中并不是堆积了分组而是减少了三个分组。因此可以适当把拥塞窗口扩大了些。

        在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。

        采用这样的拥塞控制方法使得TCP的性能有明显的改进。

        接收方根据自己的接收能力设定了接收窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。因此,接收窗口又称为通知窗口。因此,从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口rwnd 。

        发送方窗口的上限值 = Min [ rwnd, cwnd ]

        当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。

        当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。

    两者简单比较:

    相同:提高网络性能。 
    不同: 
      [1].流量控制:在TCP连接上实现对发送流量的控制,考虑点对点之间对通信量的控制,端到端,即:控制发送端的数据发送速率,使接收端可以来得及接收,保证网络高效稳定运行。 
      [2].拥塞控制:处理网络拥塞现象,考虑网络能够承受现有的网络负荷,全局性变量,涉及所有的路由器、主机以及与降低网络传输性能有关的因素。防止过多的数据注入到网络,使网络中的路由器或链路不致过载,确保通信子网可以有效为主机传递分组。

    展开全文
  • python操作windows窗口获取窗口句柄

    万次阅读 多人点赞 2019-11-06 09:16:54
    python获取窗口句柄 在Windows下获取窗口句柄时操作系统版本和软件版本对获取有影响,就会出现在本地调试正常的程序,交付使用的时候报错。 查看windows所有可显示的窗口句柄及窗口名称。 # -*- coding: utf-8 -*- ...

    想要看更加舒服的排版、更加准时的推送
    关注公众号“不太灵光的程序员”
    每日八点有干货推送

    python获取窗口句柄

    在Windows下获取窗口句柄时操作系统版本软件版本对获取有影响,就会出现在本地调试正常的程序,交付使用的时候报错。

    查看windows所有可显示的窗口句柄及窗口名称。

    # -*- coding: utf-8 -*-
    """
    File Name  windows_gui
    Created on 2019-11-06
    
    @author: jj
    
    """
    import win32gui
    
    hwnd_title = {}
    
    def get_all_hwnd(hwnd, mouse):
        if (win32gui.IsWindow(hwnd)
                and win32gui.IsWindowEnabled(hwnd)
                and win32gui.IsWindowVisible(hwnd)):
            hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
    
    
    win32gui.EnumWindows(get_all_hwnd, 0)
    for h, t in hwnd_title.items():
        if t :
            print (h, t.decode("gbk"))
    if __name__ == '__main__':
        pass
    

    结果 :
    (263618L, u’\u5fae\u4fe1’)
    (66630L, u’\u5c0f\u706b\u7bad\u901a\u7528\u52a0\u901f’)
    (131362L, u’Program Manager’)
    (132782L, u’python\u4e2d\u7684\u89e3\u7801\u4e0e\u7f16\u7801 - zhang_cherry\u7684\u535a\u5ba2 - CSDN\u535a\u5ba2 - Google Chrome’)
    (67384L, u’\u57ce\u5e02 - \u4e00\u4e09’)
    (131572L, u’\u4efb\u52a1\u7ba1\u7406\u5668’)
    (329592L, u’work [F:\work] - …\yanchi_auto\windows_gui.py [work] - PyCharm’)
    (329492L, u’lot_irrigated_litong_v3 [F:\jfzx_svn\001litongqu3P\03jieguan\03Development\lot_irrigated_litong_v3] - …\bus_prediction\tasks_apscheduler.py [lot_irrigated_litong_v3] - PyCharm’)
    (133012L, u’archive_record_gate_report @lot_canal_hongsipu (aliyun) - \u8868 - Navicat Premium’)
    (131690L, u’TIM’)

    python操作Windows窗口程序

    推荐阅读:

    展开全文
  • Windows10右键添加“在此处打开命令窗口

    万次阅读 多人点赞 2017-12-16 20:27:55
    由于现在Win10默认右键只有Powershell,所以为了以后方便使用就把右键添加“在此处打开命令窗口”的代码分享出来。(#^.^#) 效果 第一个是在 桌面 / 文件夹窗口中 / 选中文件夹上 直接点击右键,显示“在此处打开...
  • 有时候我们打开了一窗口,比如文本框 ,里面记了一些数据,但是一点其它窗口,要么文本框被其它窗口遮挡,要么直接就最小化了,我们需要再看文本框里面的数据的时候,就需要再从任务栏里去重新点开它,很是麻烦。...
  • QT创建两个窗口窗口内含窗口

    万次阅读 2017-09-12 19:15:33
    因为做课程设计的时候要在开发板上扩展一个摄像头,所以自然就有了拍摄画面在哪里显示的问题,最后思考决定在原始窗口上设置一个button,按下即在原始窗口上再显现一个新窗口,新窗口作为拍摄画面的显示界面,大概是...
  • WIN10运行软件,窗口不显示 解决办法

    万次阅读 多人点赞 2017-11-28 11:36:34
    win10 运行软件后,不显示窗口今天遇到个问题,我打开postman之后,任务栏显示它已经打开了,但是窗口就是不显示,如下图: 用alt + tab 查看,也能看到它!!!鼠标放在任务栏的图标上,也能看到窗口的缩略图,...
  • Matlab图形窗口大小的控制,plot窗口大小,figure大小,axis设置,实用 转载自:http://blog.sina.com.cn/s/blog_48c735630101iadu.html Matlab中保存图像时,图形窗口大小的控制zz 首先要了解的是Matlab是面向...
  • 通过索引切换窗口 左边从0开始,-1是右边第一个窗口 通过窗口名切换窗口 driver.title可以获取当前窗口名,把所有的窗口遍历一遍,当窗口名和要切换的吻合就停止,都没有切换到最右边的窗口
  • 计算机网络——滑动窗口协议的窗口大小

    千次阅读 多人点赞 2019-04-27 11:44:21
    在学习滑动窗口协议的时候,我在链路层的滑动窗口这吃了不少苦头,因为动态的窗口变化真的不适合看老师发的pdf(话说老师为什么不能发PPT非得发PDF?) 虽然后来摸索着看懂了不少,但是到了窗口大小的问题上又蒙圈...
  • 桌面窗口管理器占用过高解决办法

    万次阅读 多人点赞 2021-03-24 09:06:40
    在任务管理器中,您会看到桌面窗口管理器(Windows 7上的DWM.exe或以前的Windows版本)的COU使用率很高。 此线程将删除您在Win10系统上关于此CPU问题的所有混淆。 什么是Win10系统上的桌面窗口管理器(DWM.exe)?...
  • ▐ 应用窗口非最大化状态下的快捷键 command + m 最小化窗口 command + h 切换最近使用过的两个窗口 ▐ 通用快捷键 command + tab 切换最大化的其它应用窗口 command + control + f 最大/缩小当前窗口 command + w ...
  • windows切换窗口,取消edge窗口为多个

    千次阅读 多人点赞 2021-02-08 17:09:26
    windows切换窗口,取消edge窗口为多个原图无法截取设置:1. 点击设置,找到系统,找到多任务处理2. 需要修改 按Alt+Tab将显示这样在切换窗口时,edge窗口就为一个 原图无法截取 设置: 1. 点击设置,找到系统,找到...
  • 模态窗口和非模态窗口

    万次阅读 2019-02-22 18:37:54
    模态窗口就是在该窗口关闭之前,其父窗口不可能成为活动窗口的那种窗口。 例如: 窗口A弹出窗口B,如果窗口B是模态的,在窗口B关闭前就不可能切换到窗口A;如果B是非模态的,那可以在这两个窗口之间任意切换。 模态...
  • 滑动窗口和拥塞窗口

    千次阅读 2018-08-23 14:57:57
    一,滑动窗口 窗口:发送者发送的连续字节序列的集合 滑动:发送的窗口可以随发送过程而变化。 为什么需要窗口:不必每一个段进行一次确认应答,而是以一个窗口的大小进行确认。减少往返时间,提高速度。(TCP在...
  • 滑动窗口算法

    千次阅读 多人点赞 2019-07-13 22:02:14
    什么是滑动窗口算法 我们学习过计算机网络都知道为了避免拥塞发生,在网络传输时有滑动窗口协议控制传输时流量。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认...
  • 一般SecureFX只有一个远程窗口,这样上传本地文件还需要切窗口显得有些麻烦,SecureFX有个设置可以打开两个窗口,左边是本地上传文件的窗口,右边的是远程的窗口 首先没开本地窗口是这个样子的 打开view,可以...
  • matlab编辑器窗口和主窗口分开了怎么还原

    万次阅读 多人点赞 2020-06-06 14:19:33
    刚刚解决了这个问题,特此记录一下,共勉。...首先,在编辑器窗口下,按ctrl+shift+D,此时编辑器窗口和主窗口就合并在一起了。 然后,在菜单栏中选择 布局-默认,如下图。这样就恢复到原来的布局了。 ...
  • TCP 滑动窗口(发送窗口和接收窗口

    万次阅读 多人点赞 2017-03-12 11:14:53
    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。 一、滑动窗口协议  关于这部分自己不晓得怎么叙述才好,因为理解的部分更多...
  • 当IDA加载后,3个立即可见的窗口分别为IDA-View窗口、函数窗口和消息输出窗口,所有窗口都可通过View▶Open Subviews菜单打开 反汇编窗口 反汇编窗口也叫IDA-View窗口,它是操作和分析二进制文件的主要工具 ...
  • dwm.exe(桌面窗口管理器)占用内存过大解决办法

    万次阅读 多人点赞 2021-02-03 17:16:18
    esc+shift+ctrl打开任务管理器,发现是桌面窗口管理器导致的。 点击“详细信息”看具体那个文件,再点击“内存”从大到小排序,发现是dwm.exe占用。 dwm.exe上点击右键结束任务(类似其他占用也是如此,但是...
  • 解决方法:使用窗口移动精灵或AltDrag这两款窗口移动工具,摆脱只能拖动标题栏移动窗口的限制,任意移动超出屏幕的窗口,将窗口或对话框移动到顶部后,仍可继续向上拖动,使窗口顶部移动到屏幕之外,底部就会显示...
  • 当我们自己定义了一个类继承自QWdiget,并在其中实现了一些自定义的功能(比如QLabel移动到指定坐标)例如class Demonstration_Widget : public QWidget想要把这个窗口嵌入到主窗口中,与其他窗口一起在主窗口中构成...
  • 窗口Z次序:表明了重叠窗口堆中窗口的位置,这个窗口堆是按照一个假象的轴定位的,这个轴是从屏幕向外伸展的Z轴,上面的窗口覆盖下面的窗口。 Windows系统管理三个独立的Z次序----一个用于顶层窗口、一个用于兄弟...
  • matplotlib更改窗口图标

    万次阅读 2021-01-17 09:59:45
    matplotlib窗口图标默认是matplotlib的标志,找到当前图像中FigureManagerQT类的实例(即当前图像的图像管理器)后调用setWindowIcon方法即可完成窗口图标的更改。 PATH_TO_ICON = r"c:\quit.png" new_icon = QtGui....
  • flink实战--窗口窗口函数终极解析

    千次阅读 2018-12-25 18:42:26
    本文主要介绍flink窗口的操作,相关窗口基础概念参考博客:https://blog.csdn.net/aA518189/article/details/82908993 Flink的windows类型 按照行为划分可分为三类: 翻滚窗口(Tumbling Window,无重叠) 滚动...
  • 窗口页面关闭并刷新父窗口

    万次阅读 2018-07-02 10:54:44
    //在子页面写onunload方法 window.onunload=function(){ //刷新父页面 window.opener.reload(); }其他页面关闭相关方法window.opener....//关闭当前窗口设置延迟关闭窗口setTimeout('window.close()', 2000);...
  • qt 子窗口显示在窗口最顶层

    千次阅读 2020-11-02 10:38:34
    在主窗口(MainWindow)通过按钮(Btn)生成一个子窗口 (QWidget),当子窗口未关闭,且被隐藏在主窗口或其他窗口下时,点击按钮(Btn)字窗口不会有任何反应,依然被隐藏在其他窗口下。 已图片中的log文件为例: #...
  • 用PyQt5实现从主窗口打开子窗口并进行窗口间数据传递的方法 在Qt Designer中设计主窗口和子窗口界面,如下图所示 将窗口文件编译成.py文件,单独编写主调用程序,实现界面与逻辑业务的分离。主调用程序代码如下: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,431,102
精华内容 972,440
关键字:

窗口