粉丝530获赞2811


多县城程序的调试如今多县城已经被许多操作系统所支持,包括温德斯 nt、 雷纽斯系统。在雷尼斯平台上的多县城程序设计包括 多任务程序的设计、并发程序设计、网络程序设计、数据共享等。类似平台上的多线程。遵循 pose 线程接口成为 p 税的 多线程程序在雷女平台上进行广泛,可以使用 gdb 命令直接调试进行一个多线程程序。多线程程序通常存在很多潜在的错误,因此使用 gdb 调试多线程程序变得很复杂。 本书中并没有涉及到多形成的程序,因此在此不会多形成的复杂调试进行过多的介绍。

刚接触指针的时候,经常会出现断错误,所谓断错误,就是访问的不能访问的内存,比如内存不存在或者受保护等等。遇到断错误就得去调试。不管通过什么手段,一定得先找到哪行代码数的断错误,然后才能分析、修改。 调试。断错误的手段有很多,对于初学者,我推荐两个,一个是通过打印的方式定位,一个是使用 gdb。 打印的方法最简单,比如这里有个列表的代码,代码量大概三百行,从现象可以看出,列表的初始化成功,紧接着就出现了断错误。 于是我们大概能推测出问题出在了列表的插入操作上。找到列表的插入操作,可以把它分成几个功能,入餐,判断移动指针,判断位置是否合法。申请新节点。修改指针语,在每个功能的前面加上一些打印, 随便打印什么都行。再次运行,程序输出了一和二,于是问题再次被缩小,应该是移动指针的时候出了问题,这几行代码能跟指针扯上关系的应该就是第四十二行了。当然,这个只是发现了断错在哪, 具体怎么修改还得根据你的业务逻辑继续分析。通过打印定位问题确实比较慢,如果代码量比较大,又不能大概判断出问题在哪,可以借助一些工具。常用的比如 gdb 编译的时候加上杠 g 选项,直接使用 gdb, 加上文件名 r 启动程序,一眼就能看出错误在第四十二行。当然了,这个程序是我故意写的断错误,有些断错误发生在库里面,并不能很直观的看出来在哪一行, 这就需要借助断点、单步调试等等操作。类似 gdp 的调试工具还有很多,如果是初学者,没有必要掌握太多,能解决问题就行。

兄弟们又出现问题了,做的二十六键键盘在退出的时候会突然卡死,像这样点退出的时候就死掉了,看下程序直接进入了硬件错误。这里退出的时候或是在县城管理任务里面把创建的动态任务删除掉, 就是这里把注册的按键删除掉,一共有三十个按键,也就是说三十个按键显示县城和三十个按键检测触发县城,这里大概率是我给的堆占不够导致的,这里把堆占空间从六十四改到一百二十八,然后重新下载进去看, 可以看到问题就解决了,但是我怎么知道我每次给他堆占空间到底够不够,不能说每次都出了问题我才去反查,于是 我在这里做了堆占空间的动态检测,看看每个任务的实际剩余空间,可以看到在刚开始的时候,这个任务有十六的剩余占空间,现在我们操作一下开启键盘和关闭键盘。好的, 现在卡死了,我们回过头来看一下现在的堆战空间,可以看到现在剩余的堆战空间是负数了,也就是说堆战超了,这个时候我就可以在创建的时候加多一些堆战空间, 并且不用担心堆占空间浪费了。

好,这个同学们大家好,欢迎回到这个家的课堂,那么这节课呢,我们来继续跟大家讲解这个 gdp 用来解决我们啊系统中那个比较常见的问题,那就是我们的系统不知道啊,为什么 不知道是由什么程序造成,导致了我们系统的 cpu 啊,占到了百分之百,在运行的时候,也就说我们的 cpu 啊,一直处在非常忙碌的状态啊, cpu 执行的时候呢啊,占满了,占了百分之百,那么我们就要找出这个原因是什么,就说是由哪个程序造成的,对不对 啊?这种问题呢,实际上在我们的这个啊,实际的项目工作项目中呢,是经常常见的啊,突然某一天我们收到这个报警短信了,哎,说我们的某一台机器对不对 cpu 占满了, cpu 在不断的这个执行啊,不断的这个运行,导致我们 cpu 的这个达到了百分百分之百啊,因此呢,我们就必须要针对这个问题提出一个解决方法啊,找到出问题的啊地方。 我们遇到这种问题的话,实际上呢,我们一般啊都是按照这种思路来解决的,就说首先呢,我们是要找出这个系统中有哪个程序啊,占了我们这个 cpu 的大部分运行时间,找到,先把进程找到 啊,然后找到进程之后呢,我们再来确定,哎,这个进程中的哪一个县城啊,占据了我们 cpu 的大部分这个执行事件啊, 最后呢,我们再进入这个县城啊,利用我们之前学习到的 gdp 调试县城的方法啊,来定位这个县城究竟在什么地方频繁执行这个单 啊,所以呢,我们是这样来啊,这个解决这种啊, cpu 占百分之百,运行的时候占百分之百这样一一个问题的啊,这是一个常见的思路,因此呢,我们在啊解决这个问题的时候呢,我们当然就要进入相应的这个系统, 然后呢我们要啊,结合一个 top 命令,先找到相应的进程和进程中的线程,然后呢再进入这个用 gdb 进入这个线程啊去定位问题, 所以呢,那么现在呢,我们就开发出了这样一个例子啊,就写了这样一个例子,那么这 这个例子呢,实际上它就是在运行期间会导致我们这个 cpu 啊执行呢会占百分之百啊,那么我们现在呢,就来给大家演示一下啊,给大家演示一下我们是怎么去定位这个问题的。首先呢,我们 啊,这是我们这个 cpu 占百分之百的这样一个项目啊,这是我们写的代码,现在我先不给大家看这个代码,我们直接把这个程序运行起来啊,然后呢我们再来观察它, 来大家看一下啊,我在这个地方我来直接运行 cpu 啊,一百 demo 这个程序 啊,运行起来之后呢,我们在另一个终端上,我们来看一下,我们运行一个什么呢?运行一个 top 命令最大,哎,大家看一下,运行了 top 命令之后呢,我们这个这个 突破命令,他默认就是按 cpu 来进行排序的, cpu 的这个利用率来进行排序的,但是很显然通过这一列我们就可以看到 cp 我们的 cpu 已经达到了百分之百, 哎,对应的进程的 pad 是二五二,说明呢啊,这个进程的名称叫 cpu 一百点五,对不对?是这个进程导致了我们的 cpu 占百分之百啊,运行的这个利用率已经达到了百分之百, 就说明这个 cpu 啊,一直非常忙,一直在执行代码,是不是这个对我们普通的这个系统来说是不可能的,一定是某个程序出了问题了 啊,我们的 cpu 不可能就是说啊,长期处在这样大的一个运行这个状态,对不对?好,那么我们确定了这个二五二 cpu dem 一百 demo 这个进程造成的啊,那么我们现在呢,要 需要进一步确定二五二这个进程中哪个线程造成的?是不是?哎,所以呢,我们先按 q 退出这个命令,然后呢我们再执行一个啊,带上一个参数叫 ph, 大写的 p, 小写的 h top 减 ph, 后面跟上我们这个二五二这个什么呢?这个进程的 p i d, 然后回车啊, top 啊,拖不见 h p, 不是 p h h p, 二五二回车。好,大家看一下啊, 在这个里面我们就看到了,实际上呢啊,我们二五二这个进程中,你看这个线程他占的 cpu 的啊,利用率达到了百分之九十九点九,说明是他造成的,那么这个线程的 id 是什么呢?是二五五啊,是二五二五二这个进程中 县城 id 为二五五这个县城造成了我们 cpu 的这个啊,占用率达到了百分之啊九十九点九,说明是他造成的,是不是?现在我们已经大致了解清楚了,好,现在我们退出这个突破迷,你现在我们直接上 gdp 啊 touch, 后面跟上我们这个进场的 p i d, 那就是什么呢?就是二不二,是不是二不二推车, 好,大家看一下啊,现在我们已经啊用 gdp 而踏启到我们这个,呃,进程上 啊,啊,踏起了我们这个进程上,现在呢,我们啊,比如说我们可以直接来 infra 的一下,就可以看出我们系统中有多少个现成,是不是?然后我们找到二五二这个现成,你看这就是啊,我们来看一下,就是,呃,我们在上面看, 看到主要是二五五这个线程,是不是,所以呢,我们要在这里面找到二五五这个线程是谁,是他,是他 看到没有,是这个线层造成的,所以呢,我们就要啊切换到我们的这个四号线层去,二五五对应的这个线层的 id 是四,所以呢我们用 sprite 四进去,进去看看,进去看看之后呢,然后呢我们来看一下这个 bt, 看一下他运行的账, 但是呀,这就是我们啊这个线,这个,呃,进入四号现场看到的这个运行的站,这个站里面呢,我们看到啊,这个地方是我们 mt 点 cpp, 这是我们自己的代码 啊,我们原文件中代码是不是在这个地方呢?我们看一下,我们看一下这块啊,就是 m t 点 c p p 中的第十二行啊,对应的是二,对不对? 我们用 f 迷你 f 跟二看一下这个位置是什么,哎,我们就可以看到啊,在 mt 点 cpbd 第十二行就是 print thread 这个线层里面,哎,恰好十二行的这个地方在进行外循环, 那么看到这儿地方,我们就大致的清楚说明,可能在这个县城里面这个地方是一个循环,那么这个循环有可能就是一个什么,就是一个死循环啊,或者说我们在这个循环里面没有进行一个啊睡眠, 所以呢导致了这个死循环呢,这个循环呢在这里一直空转,是不是啊?导致了他啊,使得我们的 cpu 的这个利用率达到了百分之百啊?我们看一下,所以呢我们 大概明白了这个原因了,所以呢我们啊,现在呢,我们就退出调试,回到我们的这个代码中来,我们来看一下这个结果啊, 我们把这个新程序退出,然后呢我们看一下 m 七点 c p p 中的第十二行,是不是啊?幺二,哎,看一下,在这, 这其实就是一个新的线的一个 printfree 的这样一个线层,在这个线层里面呢,同学们看一下,在十二行就这个地方啊,这个地方恰好是一个外循环,而且这个外循环里面确实是在一个,做一个什么呢?做一个 空转,对不对?这个地方是一个空语句,所以这个地方这个循环一直在这啊执行,一直在这执行, 所以他造成了一个死循环啊,这个循环呢,导致了我们 cpu 达到了百分之百啊,这个执行的时候利用率已经达到了百分之百,是不是?这是不被允许的,你看这样一来,我们通过 gdp, 那我们先通过托普迷你 找出了系统中占用 cpu 过高的进程啊,然后再次通过 c 这个 top 找出了这个系统中啊占用 cpu 过高的线层, 然后呢我们用 gdp 进入这个进程啊,切换到对应这个线程中,就可以定位到这个线程中具体的代码, 哎,然后我们回到原代码,看到这一行的代码,我们就基本上就可以把这个问题搞清楚了,是不是搞清楚了之后呢?那我们要做一个什么事情呢?像这种死循环的话,我们其实呢啊可以在里面加一个睡眠的语句 啊,加一个睡眠的语句,我们把这个空语句现在把它啊暂停啊,把它取消掉,然后我们再编一下,哎,这个时候呢,我们来执行一下,好,我们通过 gdb 的调试找 到了这个系统 cpu 啊利用率达到了百分之百,这样一个问题所在,是不是并且呢我们做出了修改,修改之后,我们现在啊再来运行一下 top 命,哎,你看这下的话,那么我们这个 cpu 一百点五, 哎,他就正常了,是不是他的 cpu 这个占用率就变得非常低了啊?基本上我们看不出他的这样一个效果,但是这个地方我们运行 top 命令的话,哎,他实际上他可以按照 啊 cpu 的占用率来进行排序,也可以按照内存的占用率来进行排序,这是内存就是 cpu。 那么我们怎么做的呢?你可以按 x, 在我们键盘上啊,按下 x, 他会 以高亮的形式显示,告诉我们哪一列是目前我们排序的标准,你看我们按下 x 这一列就变亮了,所以呢,这 也是我们现在排序的标准啊。默然,他就是按照 cpu 占用率来进行排序的,每个进程执行的时候占多少 cpu 是不是?然后我们再按 x, 他就按下去了,但我们还可以按 shift 和左箭头号和右箭头号啊, 就是大大于号,小于号,跟我们键盘上大于号小于号来切换这个排序的列,你看我现已经按下了这个,这个大于号就是左箭头号啊,就是右箭头号的话, 按下来右键的话,所以呢,这个时候呢,哎,我们按下 x, 你看他就按照 mam 这一列啊, mam 这一列已经高亮了,所以他按照内存的这个占用率来进行排序了,你看啊,这个进程,这个进程啊,占用的内存的这个 百分比好,比如说我再按一个大于符号,哎,他就按照时间来进排序了,看见没有, 那我按一个小于符号,哎,他又回到我们这个面目了,对不对?再按一个小于符号呢,哎,他又这个切换到我们这个 cpu 这个地方来排进排序了,所以 top 迷你进排序的话,我们可以通过 x 按下 x 键和按下大于号和小于号来进行切换 啊,按下 s, 我们可以看到目前是哪一列作为我们这个系统资源的一个啊,系系统数据的一个排序这个标准,然后按大于号,小于号呢,可以切换这个排序的这个列数,是不是? 好,那么同学们大家看一下这个问题呢,我们啊这个 c 程序执行的时候 cpu 占百分之百,这种问题呢,我们就通过这样一个啊,非常方便的找到了这个问题所在,并且呢,哎,得到了解决,对不对? 好,那么这就是我们给大家演示的这个啊,我们系统中发现,如果我们的 cpu 啊,它的利用率达到了百分之百的话啊,我们怎么去啊?以一个什么样的思路啊去解决这个问题, 我们就给大家讲到这,主要的就是结合 top 命令和这个我们的 gdp 啊,来进行这个定位的,对不对?好,那么这节课呢,我们就给大家讲到这啊,如果同学们想后期更多学习资料,欢迎访问我们官网部的各点 com, 或者做国家 it 点 com, 欢迎通过 qq 三幺七九零八九九五联系我们。同学们,我们下次再见,拜拜!

如何第八个调试加法程序,那我们下面看一下,我这里写了一个类,然后里面写了一个进的方法,然后问方法开始运行,进行的时候,首先我们创建一个县城,这个县城里边呢执行我们上面这个方法,然后下面我们紧接着又掉入上面这个方法。那么在这个成语中,我们有两个县城,一个是梦这个县城,一个是十万的这个县城, 那我们怎么进行调试呢?我们这个定个断点,这里定个断点,然后我们底盘要去调试。好,那么这个时候我们就往下走,往下走,往下走,往下走。好,这个程序就执行完了,那我们这个啊,县城里边的代码我们看不到他的执行过程,我们可以再跑一遍, 我们发现在这个县城站中只看到一个闷县城站,看不到那个死拽的那个县城站,所以我们调试运行的时候,他就直接走完了。好,那么这个时候呢,我们怎么办呢?我们可以啊把这个断点这里 选择现成模式时代的确定,这个呢也选择现成模式确定。好,现在我们在第八个运行, 那么这个时候我们可以看到在这个里边呢,有一个梦县城,有一个史帅的雷这个县城,史帅的雷这个县城就是我们这个县城,梦县城就是我们梦县城,所以有两个县城, 两个县城站,那么这样的话我们调试,首先调试闷县城,往下走,往下走,往下走,往下走,闷县城直行结束,接下来我们在这里选择使出来的零线城点一下,好,这个时候进入使出来的零线城。好, 那么往下运行,哎,往下运行。好,这样我们程序全部执行结束。这就是我们在店中啊进行多线诊,抵到了调试。

提到多线程,我们往往会想到并发高效,于是对于初学者来说,很容易把多线程当做并发的最佳解决方案。比如服务器处理客户端的连接,来一个客户端就启动一个线程, 优点可能是代码结构简单,更容易理解,但是缺点是他处理不了太大的并发量,学习的时候感受不到。但是在项目中这样肯定不行, 因为多县城的创建、销毁、调度都需要消耗资源,如果硬件性能一般,大量创建县城会让性能急剧下降,而且县城多了还需要考虑同步思索等一系列情况。 那么哪些情况下必须要使用多线程呢?如果用一句话来概括,就是消耗时间的地方,比如阻塞的函数、 io 操作等等。如果把这些操作放在主线程中,那其他请求将不能得到及时响应,所以这些场景 可以考虑使用多线程。再回到刚才说的病方服务器,服务器要同时处理多个扣端,如果使用单个线程肯定是搞不定的。于是 unix 又给我们提供了 select 破一破这些技术, 我们把它称作多路复用。在这基础上,又有人分装出了 levant 等等一系列的高并发框架,如果你觉得它还不够,还可以配合起来使用, 你背一半加多线乘,你背一半加线乘十。如果你准备做服务器开发,这些也是必备技能。最后再总结一下,多线乘并不是解决并发的最佳方案,甚至可以说,在单核服务器中,能用单线乘就不要用多线乘。

大家好,呃,我们今天呢分享一些技巧,本着对大家负责的态度,我们分享的内容呢, 打算都定位在我们至少用过或者操作过呃的这个呃尺度上,所以今天给大家分享的呢是一个 渲染上的功能。很多小伙伴都知道,就是说当我们去渲染的时候,通常发现 cpu 的使用率都并不高,那么这就造成了我们 们的一些浪费,呃,当然有一些小伙伴会说,呃,那我使用率低一些,会对我的硬件起到一定的保护作用,但这个一般不太符合公司啊,或者说是,嗯, 这个工作室的这个运作效率上的考虑,因为在工作室或者在公司这个层面上面,大家呢更多的时候, 嗯把效率是当做第一位的,因为效率直接与经济是挂钩的, 呃,也就是说,呃这个预算的多少,呃,其实和效率呃相比起来,他们之间是有合算关系的。所以废话不多说,今天我们来说一说, 呃,在渲染的过程当中,我们如何让自己的 cpu 跑满,或者说我们尽可能的用流行话来流行语来说,我们去榨干 cpu 的这个呃工作效率, 呃,我们看看会怎么样啊?首先呢,嗯,我们看怎么去做这个东西,因为大家发现在渲染的时候,这个东西呢有时候会很慢,那么我们第一步, 首先我们要将这个工程文件存储在一个完全的英文目录下,至于为什么这么做,嗯,稳定性, 呃出错率低, bug 时候,呃,我们主要是考虑这个方向啊,呃,我们随便走一个 个这么找一个这样的英文的文件家存储一下,我们把它放到这里啊,我们起一个名字啊, 但是这个就只提醒大家必须采用英文啊,由我以日期来命名。 好,我们将这个文件夹存一下,那么你起名的话,根据自己的习惯,我们喜欢全篇, 然后呢,这个时候我们需要去渲染他,然后我们需要把什么把这个相应的序列渲染序列打开,嗯,在这里需要大家去 改一个东西,那么首先我们要把它的格式改成什么呢?改成图片序列,否则的话, 嗯,你是无法进行这种叫做多线程序渲染的话,我们把它改变, ok, 然后我们把 这个点上这个,也就是说是他会采取多线程多机器的这么一个渲染工作,然后会自动跳过。呃, 已经渲染成型的文件,我跟大家说一下,为什么说为什么不采取多机器去渲染呢?呃,公司按理来说都有这样的条件,包括我们在内也是。嗯,我们其实是有条件去这样做的,比如说我们 采取用五台、六台机器同时来渲染这个东西没有问题,但是事实上呢,由于啊都比这个软件啊, 他的相关授权,这个还好说,比如说我们舞台机器都有他的授权,那么他在渲染的时候不会有冲突这一讲, 但是我们无法保证所有的插件都是有完整的权限的。比如说那么我这台机器上安装了这个插件,那么拿到的授权可能只有这一台机器的授权,当我另外一台机器在用这个插件的时候,那么两个 就开始冲突,那么这个就把就把机器多机器渲染的可能性就给降低了,你这台机器在使用这个插件,那么另外一台机 一起会自动下线,他就是这个样子。所以说我们目前大量的采取的还是通过单机位多线程去渲染, 呃,当然有重大项目的时候,嗯,我们不排除去使用多机器去渲染,甚至食材甚至怎么样,但是多数时候我们一般会控制插件,很很容易理解,那么我们就不多说了, 那么这这其他的都不用改,那这个随你,随你的意愿吧,无所谓。 好了,这个地方也是一样,我们需要去干嘛?我们需要去给他设定一个英文的文件夹, 名称也是一样。比如说我们 好了,这个时候呢,我们不要去管他,我们直接去退出就好了。 退出之后呢,在这里我们打开 cmd, 也就是说是这个系统的到此命令啊。然后呢? 呃,因为我这里使用的是双屏,可能大家有时候我尽量把它拖到这里,嗯,怎么操作呢?可能大家,嗯, 都了解这个功能,可能用的可能相对比较少。在这个 ae 的主程序的上方有一个 ae winter 的一个应用程序,其实就是 ae 的渲染器, 那么这个渲染器呢?我们首先把它拖到这个里面去, 那么它会自动产生一个路径啊,在这这个这步做完以后,空格杠 project 空格,找到我们刚才保存的那个工程文件, 把它拖进去,那么这个命令行的,其实他的意思就是我利用 enter 的这个应用程序去渲染刚才我们做好的那个工程,那么这里面当然就包含了,嗯,我们设定好的路径等等。 然后很简单,我们不需要做其他工作啊,回车他就自动开始执行,那么这是一条线层已经完成了他的开始渲染工作,我们 接着怎么做呢?接着就是不停的去多建立几个这样的工作,然后空格杠 空格把我们的工程拖进去围车。第二条开始,这个时候呢,我们打开我们的任务管理器,发现他已经开始 很疯狂的在渲染了,那么我们依次类推,我们可以做很多, 当然我渲染的这个工程可能不是不是那么吃力,也不是那么大的一个, 所以大家看起来好像很快,但是其实呢,我们经常有时候会做一些例子啊,做一些很复杂的特效,可能打开这个工程都需要半天, 那么这个就很快就派上用场了。 我们再去看一下,现在他集中在六十、七十左右,嗯,甚至到五十,也就是说平均下来可能就是百分之六七十左右的这个使用率, 我依然觉得他很低,好吧,就不停的去增加啊,这个没有什么好 走 the, 但是这个渲染我们也发现了,他有,他有他的一定的弊端,嗯,比如说当我们的显卡支持 gpu 运算的时候,嗯, gpu 的使用率非常非常的低,这个就是说,嗯基本上是在使用嗯, cpu 渲染的这种呃模式啊,但是我们从实测的这个角度 来说,嗯,正常应该会提升的,这个效率应该是在三倍左右。我们这个时候我们回到我们的软件看一下 啊,那渲染到四万多只 啊,他一次生产出来十个,那么这个可能就是他这个每个县城的, 所以我们我我们能够呃感受到 到的是什么?就是说这个多线城的这种渲染方式,其实是在把我们 多线层的 cpu 或者多核心的 cpu 它本身的优势去发挥出来。其实很多时候,比如说有一些人在使用一些,嗯, 非服务器版本的 cpu 的时候,他单纯的他的阻屏非常高,但是呢他没有,呃,他的核心并不是很多,或者他的线程数并没有那么大的量, 那么像这种 cpu 呢,那么他的优势就是说,那么他不使用这种方式的时候,他甚至会,嗯,优于这种 cpu 的渲染效率 啊,因为他是他他的革新数,或者说他的这个现成数,呃,并没有那么多,但是他的这 这个主频是非常高的,所以这个就是我们就可以认识到那么 多核 cpu 或者说是服务器的 cpu, 那么我们要那么多核心,对吧?嗯,然后我们的主频并不高,那么我们去怎么样去,嗯体现我们的优势呢?可能这种多线程的做法,嗯,多 cpu 的做法会帮助我们 那么去和现在一些主流的啊,非常主频非常高的水平去 pk 他的这个工作效率。 好了,我们看一下,现在这个就全部都渲染完成了,这是我们常用的一种方法吧,一般就是说做完了,然后开炫,然后我们下楼吃饭 就把机器打满,打的他跑不动,就是基本上你的鼠标弄不动为止,然后我们就下去吃饭,一般回来基本上 不是说特别庞大的工程,一般一个小时左右也就渲染完了。呃,请大家记住我们,我们呢只分享我们用过的,那么, 呃,希望有更多的这种我们常用的一些方式方法。

啊,可智可取,那么这里就需要一个句柄,这个句柄是什么句柄呢?啊?这里需要句柄呢?是编辑 框的对比,因为咱们要把编辑框里边写内容,不是把它标题上写,所以是编辑框的对比,那么既然是编辑框的对比的话啊,那么呢? 啊,那么呢,那么什么呢?咱们获取到的是 记事本主窗口的句柄,对不对?那么咱们就需要通过这个主窗口的句柄啊,来获得编辑框的句柄。怎么获得?怎么获得也特别简单啊,就窗口没句主窗口就可以了啊, 张口,美女啊,张口,因为他只有一个子,咱们可以打开这个 工具来分析一下啊,他就是在他这个第一层下面啊,所以不用面对左右,请看只有一层,对吧?同时只有一个,这没雨砖就行了,没雨砖就行了,他需要一个子窗口入组啊 啊,把句柄传递给他,句柄是哪个呢?哎,大家请看美女所有子弹头发,不管美女有没有美女什么你得有这个句柄啊, 对不对?那么这个句柄咱们需要来获得一下啊,首先咱们先来获得这个句柄, ok, 首先咱们来获得这个聚饼,那么怎么获得?在这个内部来怎么获得这个聚饼?这个是一码事啊,这个是一码事,应该怎么获得呢? 咱们有很多种方式啊,咱们有很多种方式,我在之前我跟你们说最好少去操作页面,对吧?那么呢,你的句柄存放在哪里?是不是存放在这里,对吧?你就必须得操作页面 啊,你就必须又得操作页面,那么操作页面呢?用操作页面吧啊?操作页面的话,那么就需要从这个超级电脑上取出标题出来,把他的剧名取出来,对吧?啊?就是从这个超级电脑框当中把剧名 取下来,那就是超级列表化取标题啊,咱们看啊,一步一步看取标题,那么取标题需要表象,所以说列组列列式,咱们知道一表象,所以咱们需要在这个现场中知道啊,怎么才能知道这个表象?所以呢 啊,其实呢啊,咱们有好几种方案啊,好几种方案, 首先啊,咱们先来考虑一下咱们多线程是一种怎么样子的多线程形式,你先知道这码事,咱们多线程是怎么样子的一个多线程形式, 这是什么意思呢?啊?有好几种形式啊,第一种啊,先说第一种,第一种就是你比如三个窗口啊,那么就启动三个现场同时操作的三个窗口啊,这是第一种, 你就是说你有四个窗口,也就创建四个县城,有五个窗口,创建五个县城,知道吧?啊?这是第一种,那么第二种呢啊,你有十个窗口啊,但是呢你创建两个县城,那么两个县城呢?把这十个窗口挨个操作一遍就行事,懂吧? 那么咱们现在确认一下咱们以哪种形式来做啊?当然对,咱们来做的话啊,两种形式都咱们都采用一遍,好吧?啊?所以说呢,咱们先选第一种啊,有多少个窗口,咱们创建多少个县城 啊?那么咱们创建现场的时候咱们现在看,咱们现在看,咱们创建现场啊,现场啊,启动,对吧?那么它启动的时候可以创建一个参数,你们看到没有?是不是可以创建一个?是不是可以传递一个参数?那么你 可不可以把这个参数传递为当前县城要操作窗口的窗口对比,或者是要操作窗口对应的超级地板放的表像数啊,表像投影可不可以?肯定可以,对吧?所以说呢啊,咱在这里边, 首先咱们要创建的县城呢,是县城啊,此程序对吧?传递什么参数呢?咱们就直接给他传递啊,当前的区别,过去咱们不用在县城内去取,咱们在县城外把它取好给他传递,这样子 啊, ok, 那么首先祭祀循环手,祭祀循环手旋转多少次呢? 超级超级列表框一点取表加数,这样的话是学员多少次呢?就是超级列表框有多少个,他要学员多少次。然后来个局四组 啊,直接把锯柄取出来啊,把锯柄取出来,锯锯柄整数行,但你也可以把它们为完美型啊,因为它这里传递的这个参数呢是个整数品,所以咱们最好还是为整数去, 没有没分类型的话,你这里怎么传呢?就倒走,是不是这样啊? ok, 那么在这里的话局距离等于什么呢? 啊?等于超级猎宝放一点取标题,猎柜呢是一表, 为什么呢?是什么呢?表扬为你从零开始算的零一二三四五啊,技术学员手那个学员自主是从一开始算的一二三四五,对吧?那么呢他应该怎么办呢? 橘次数减一,这个咱们今天说过了,对吧?啊,那么呢,直接启动他,然后把这个聚饼传递给他就可以了, 这样子, ok, 那么在这个接收到啊,这里接收到的就是聚饼吗?对吧?餐啊,聚饼怎么做去啊? ok, 那么这里边咱们先直接输出一下啊,先输出餐聚饼来看一下, 我们先来看啊。啊,这里报错啊,因为这个取标题呢,是整数型啊,是文版型,咱们要倒整数一下啊。 ok, 那么现在获取排列,他现在排好了,对吧?因为为什么有有一个没有呢?因为他最因为最小二啊,咱们再来排列一下啊,然后呢,点击开始,咱们来看他这里得到了几个啊?零零零,为什么得到零呢?因为咱们填错参数了啊, 表象,所以从零开始,翻列车也是从零开始翻,咱们传这个一,这个应该是零啊,答错了,获取啊,开始,大家请看 对不对?咱有问题。什么问题呢?啊?这是什么问题呢?同学们一会再看。一二三一二, 对吧?啊,明显有问题啊,这是什么问题呢?咱们再来看一下,或许开始哎,现在又有一二三,哎,这怎么回事啊?或许开始啊,有没有知道这是怎么回事的? 其实这个模块自带的啊,这个啊,这个全是猪啊,是特殊功能之后当中的啊,他是有一点在多线城外面是有一些问题的,知道吧?啊,他是有一些问题的啊, 就是有一些 bug, 可能会触发 bug 情况,就比如刚才输出了两个,那就是 bug 一个情况,对吧?啊, 所以说呢,这只是输出的问题,实际上来说这个线程还是创建了的,知道吧?啊,但是这个出现的可能性不是很高啊,反正我用这么久我出现的次数也不是很多,那么现在在这个里面也要把 这边取得啊,咱们需要啊,就需要来实现这个了啊,把子窗口的这边取出来,副窗口这边有了啊,子窗口咱们返回一个局啊, 在里边操作一些工具的时候,咱们最好采用局部变量来储存它,不要用成立局或者全局,因为那些是共同的啊,要区分清楚这三个变量的啊,这三个变量共同资源和非共同资源啊, 非共同资源就是私有资源,私有资源就是局部原谅啊,共有资源就是纯局原谅和纯局原谅 啊。那么还有共有资源还有很多,你共同操作一个文件啊,做共同操作一个数据库,你共同操作一个其他资源,比如说产量,那么你说这个产量它是共有资源还是私有? 这个产量可能是个共有资源,但是你要这样来讲,为什么不要操作共有资源,就尽量不要操作,为什么?因为你在操作共有资源的时候,一般是有毒有血的,有毒有血的话就会有问题,对吧?但是这个常量只能读不可写, 就现在他是一个固定的文本一样,对吧?那么他是肯定是可以这个在图片当中进行操作的啊, 他虽然属于共同资源,但是呢,他不会对你程序造成出入啊,不会对你多钱能造成问题啊?就比如你共同操作这个啊,你就。

程序员进阶一定要会的工具, gdb 调试。 gdb 是 gun 项目下调试器,他允许程序员在调试代码时检查里面到底发生了什么。 gdb 可以做以下四个项目,一、启动的程序可以按照你的自定义的要求随心所欲运用程序。二、可以让被调试的程序在你所指定的调制的断点处停住。三、 当程序被停住时,可以检查此时你的程序中所发生的事情。四、可以改变的程序,将你的 bug 产生的影响修正,从而测试其他 bug。 当然, gdp 不只是调试 bug 这么简单,还可以跟踪堆建调试进程。学习地址如下,赶紧点赞收藏吧!

大家好,今天给大家介绍一个组件,就是 background worker, 我们使用这个组件可以非常轻松的制作一个异步多线程的程序。好,我们首先将这个组件拖到界面上, 基面上是看不见的,因为它是一个主键,我们在下方可以找到它。当然我们也可以直接在窗体的代码当中溜一个这个类的对象啊,效果是一样的。 当前在我们窗底上呢,有一个进度条,有一个开始的按钮,还有一个取消的按钮, 也就说我们今天要写的这个程序呢,就是说使用这个组件让他在后台运行一个线程,不影响我们 ui 的一个线程。同时呢我们可以启动 它,也可以终止它,它在运行的过程当中,我们可以显示一些它的进度,还有它工作当中的一些状态信息。 为了方便大家理解,我给大家绘制了一张 cad 的图纸,我们来看一下, 通过它呢,我们可以很快地理解这个组件的功能,我们可以把这个 background worker 想象成一个盒子,在这个盒子里面呢,我们 可以放上我们的一个处理代码,他是在单独的一个县城当中来执行这些处理代码的,然后我们这个盒子上面有个 开关,当我们按下这个开关的时候,那么这个处理代码就会进行他的处理。红色的按钮呢,我们可以终止他,有的他没有执行完,我们也可以终止他,我们可以在开始的时候给他一些原材料,也就是参数。 我们在结束的时候呢,可以输出一个处理的最终结果,就 result。 在他运行过程当中呢,我们可以看到他的运行的状态,也说我们这个盒子可以非常方便的来管理一个翼部的一个线层, 我们不仅仅是直接启动了就不管他了,我们可以看到他中间产生的一些状态数据,可以启动,可以终止,可以给 参数,可以得到结果。好,我们来具体写下代码,我们打开代码界面,第一步我们要对这个组件进些基本的属性设置 第一个属性,它的意思就是说我们的进度报告是否允许发送,也就是我们这个图纸里面的这里, 在我们这个县城运行当中,是否将他的状态信息发送出来,当然我们这里是要处的。 第二个属性呢,就是我们的 consulation, 就是我们的取消,是否允许取消?如果你在 这里设为 force 的话,那么我们这里这个按钮呢相当于按下去也没有作用,所以我们这里同样的设为处。 当这两个状态设置了以后呢,我们需要做的下件事情就是设置这个事件处理程序,你说我这个盒子里面到底要运行什么样的代码要给他啊?他有一个 do work 这样一个事件, 我们选中这个主键,然后在这边四键窗口里面找到他的四键,第一个双击 好,我们现在将代码已经拷贝到这里面来了,也就是说我现在这个多线程启动 以后要做什么事情,我把它放在里面了,我们再来设置一下它的启动代码, 也就是我们这个按按钮的这个单击四键,我们双击创建了这样一个方法。然后呢我们选择一下, 我们来讲一下这段代码,这里面呢就是我们的这个组件的一个启动的方法, 他有两两个存在,就是一个是没有参数的,一个是有参数的,就是我启动这个线程可以在这里面放一个参数,也可以不放参数。 但是 在我们启动之前呢,这里要进行一个检查,我们这个组件当前是否忙,如果不忙的情况下,我们才能够启动他,比如说他已经在执行一个县城的时候,那么你是不能启动他的。 好,这是我们的启动代码,非常简单,那么我们再来做一个取消的代码,同样的是这个按钮,我们双击 也是非常简单的一个方法就可以取消现成 就是看守方法啊。当然呢我们看到这个启动和取消呢,它都是一个翼步的,都带了一个 isonk 这样一个后缀。 在这个取消的方法前面呢,我们必须要进行一个检测,就是我这个组件是否允许,是否支持取消这个命令,哎,我们在上面已经设置过了,是允许 取消,所以我们这个时候才能真正的取消。 好,现在呢我们来研究一下它最终执行的这个代码,也就说在这里呢,我们已经点下这个按钮的时候,我们已经可以启动它了, 那么就进入了这个线层里面,这个线层呢就不会影响我们的 ui 啊,通过我们的这个 thunder 对象呢,我们 可以得到我们的这个组件, 也就是说这个方法里面的所有内容,它会另起一个线程,而不是在我们的 u i 线程里面运行, 同时我们还可以通过这个参数一可以得到我们刚刚传给这个线程的一个参数 argument, 就通过这个我们就可以得到它的参数,当我们这里面没有使用,所以我最后直接给返回值了。 在这个方法里面呢,我们是做的是一个循环啊,我们 i 从一到一百也说循环一百次,当然我们这个县城可以不是循环的啊,我们这里, 嗯,做一个循环的更好理解一点,比如说我们要复制一百个文件,那么我们一一个一个文件的复制,复制一个,那么我们任务就完成了百分之一, 我们就可以在这个里面呢给他发送一个进度报告,然后把这个一传给他,复制了十个文件,我们就传个十给他, 我们的进度就完成了百分之十,一百个文件的时候,我们就百分之百啊,当然你可以说你不是一百个文件,你是两百个,那么我们这个时候可以对这个 i 进行一个处理,那么就最终也可以得到它的进度。 也就是说在这个方法里面我们使用了 report progress, 就是提交一个进度报告,这个方法呢非常重要 啊,他会引发一个事件,就是我们马上要写的一个代码,当我们提交一个报告的时候,就相当于是我们在这个地方提交了一个状态数据过来, 那么我们这个线程外面的线程,就是我们 ui 线程就可以搜到这个数据,将它显示到界面上。 我们双击创建这样一个事件处理代码, 就是 progress change 这样一个,就是我们进度变化这样一个处理事件,同样的我们把代码复制过来。 嗯,这里要给大家说一下我们这个事件处理程序,它是义不调用的,也就是说它和引发事件的代码不在同一个线程上。 progress 清级的事件处理代码,它和创建 background worker 的线程是同一个,也就是 ui 线程上执行的 同时,他还传递了一个数据过来,这其实就是跨线层访问空间,跨线层传递数据的一种方式,而且我们不需要做任何事情,直接就可以使用。比如我们在这里面我们使用了这个 progress 八这样一个就是进度条它的 y 六,我们可以设置它为我们参数里面的这个数值,这个数 值其实就是我们这里传过来的这个 i, 当我这里运行了 百分之多少的时候,这个 i 就传过来了,传过来以后我设置这个进度条的这个 value, 那么我们就可以显示到界面上,看到我整个任务完成的进度。同时呢我们可以设置这个 label 的 text 属性来显示它的百分比进度, 可以来看一下效果, 当我们点开始的时候,这个进度条就可以从百分之一一直走到百分之百, 这个地方呢也会显示它的进度,它是一个跨线层的事件, 通过这个事件传递了数据给我们的 ui 县城,我们不需要做其他的任何处理,不用写一个 in work 这样来处理。 好,我们再来看一下如何取消这个现成的,就是我们的 ctrl 怎么来执行的, 我们这里虽然有一个 ctrl 这样一个方法,但是我们如果不做其他的处理,你点了以后它其实不会有反应的,我们必须要在我们的这个 县城里面对他进行一个处理,就是这个地方也说在这个循环里面我执行百分之一,我要来检查一下其他的县城有没有取消,我们这个县城就这么的 开始类型这样一个属性啊。在这里面如果是处就代表说其他的县城当中执行了一个看守这样一个方法来取消。如果是取消的话,我就需要进行一个设置,然后终止我们这个循环处理 啊,这个就是我们的取消的一个处理啊。在上一个视频当中呢,有朋友就是在问,就是说能不能够,就是说不用这样循环的,不断的 这样来取消了,就直接给他一个命令,然后他就取消掉了,那这种属于强制的取消啊,是非常不好的,哪怕我们这个程序不是这样循环处理,不是一到一百的这样循环,那么你是一个线性的代码啊,你 走几步你要判断一下啊,外面是否取消了,走几步我们再判断一下外面是否取消了,一样的,我们必须要时刻去监视这个值,如果取消了,那么我们就要结束我们的代码执行,这才是正规的规范的一种取消的方式。 在这里要给大家说一个事情,就是说这个地方我们使用的 thread 来休眠呢这样一个时间点, 嗯,实际编码当中这个代码肯定是要被替换掉的,你说这一块才是我们 真正真正要做事情的这个代码模块。比如说我在这个地方我循环的去检测我机器的设备,比如我的 prc 啊啊,各种各样的机器,它的数据,温度啊、湿 度啊等等等等这些数据当我监测到以后,我就可以通过这个进度报告把它传递给我们的 ui 县城,把它显示出来,这是我们工作当中经常会用到的技能。 那这里我们做了一个简单的示范,就说在这里我们可以取消它, 你说这个方法它有一个存在,可以有两个参数,第一个是它的完成度,就是百分比。第二个呢是我们的这个用户的数据,我们可以把我们的这些状态信息包装成一个对象, 或者包装成一个 top, 然后直接传过去。在我们的这 这个事件处理当中,我们可以接收,比如这里 我们可以在这里把这个 data 接收到,然后可以显示出来。 啊,这一点就非常好用,就是我们的跨线层传递信息传递状态。 当然我们还有一个事件要进行处理,现场所有的任务都完成以后,我们要对最终要进行一个处理,那这个时候我们还可以来写 选中这个,然后在这个事件处理里面还有最后一个事件,我们双击,哎,这个就是一个 company 的这样一个事件,也就说完成状态。 如果我整个县城所有的事情都做完了,也就是我们这个图形里面的做完了以后,我这个地方要得到一些什么样的结果进行一个处理 啊?在这个代码当中我们会有三种状态进行一个判断,第一种呢就说用户是否取消了,如果取消了,我们会显示一个取消的一个状态, 如果说在这个线程执行当中发生了错误,那么我们可以有一个错误的提示, 那否则嘞?第三种就是我们完整的完成了这个任务,这个时候我们可以显示到我们的最终处理结果啊,就是 result, 通过这个参数的 result 属性呢,可以得到我们最终的结果,当这个结果哪里来的这个结果?就是在我们这个方法里面,最后的时候付给这个 result, 也就是说我们可以通过启动这里传一个参数啊,当然也是 object 的类型的话,我们可以包装一个什么样的类型传给他都可以,这是启动代码传一个参数给我们的处理线程, 处理线层处理的时候,我们可以把中间状态输出给我们的界面, 处理完了以后我们还可以输出我们最终的结果。同样呢,它也是一个 object 的类型,我们可以包装成各种各样的类型传递给 他,然后,哎,在我们的完成的这样一个事件里面获得这个结果进行一个相应的处理啊。好,这个就是我们的这个组件的一个基本介绍。我们最终再来看一下这个结果, 点击开始,在这个地方呢就显示的是一个我们的中间的一个状态啊,这里没有变化是因为我们直接传递的是一个固定的数据, 如果是我是采采集的电压、温度、湿度等等这些,那么他肯定就是一个变化的数据,我们可以动态的展示出来。 这里呢就是运行到最后的时候,我们将结果显示出来了,因为我们的最后的代码就是显示我们的结果, read out, okay, 好,今天就讲到这里。

哈喽,大家好,今天我们来给大家讲一下一元大漠插件多现成操作介绍。 好,我们直接打开我们多线层操作的课件,这里呢我已经写好了一个多线多线层操作的脚本,用来给大家介绍一下, 那什么是多线层操作呢?我用通俗的话来讲就是同时操作 两个窗口啊,做相同的操作,或者是不一样的操作,对不对?那对于我们大漠插件来说,如果我们用大漠插件来控制 窗多个窗口,就好比模拟器窗口来说吧,我们可以同时啊用大漠插件来同时操操作多个 模拟器窗口,来全自动的运行我们的脚本,对不对?首先当然是要获取多个窗口的窗口锯柄啊,这里呢,我已经提前写好了啊,提前写好获取窗个啊多个窗口锯柄以后, 这里我给大家写了一个简单的脚本功能,就是打开雷电的游戏中心,对不对?我们同时操作多个窗口,打开我们的雷电游戏中心,好,这个时候我点击一下打开雷电游戏中心, 好,大家看到了没有?这个时候呢,他多个窗口呢,就同时打开了雷电游戏中心啊,就是这么简单啊,可以大家就是这样理解啊, 好,这个时候呢啊,我们的脚本还在运行当中啊,大家看到了啊,只有 只要我们啊,只要我们一关闭这个雷电游戏中心,他就会全自动的去打开,对不对?那可以多个窗口做相同的操作,也可以多个窗口做不一样的操作,比如说啊,这个窗口他已经打开了雷电游戏中心了,但是 另一个窗口他没有打开,这个时候呢,他找到了雷电游戏中心,他还会啊照常的给我们打开,所以用通俗的话简单的来介绍多现场操作就是这样啊,给多个窗口做相同的操作,或者是不一样的操作。那由于 大漠插件的多线层操作呢?啊,讲起来就比较复杂,涉及到很多复杂的东西,所以在新手入门课程里,我就不给大家介绍了。那大漠插件的多线层操作的实战教程呢, 我已经录制好了,给我啊,给我专门找我学习的学员,我会让他们学习。有很多新手学员啊,都想找我学习这些大抹插件的这些多现场操作的课程呢,我已经录制好了,后面新啊新手学员直接问我要视频教程来学习就可以,因为 啊涉及到这个多线程操作,然后全自动脚本的话,有很多复杂的东西,所以不方便在新手入门课程里面讲解。好。那 一元大墨插件的多线层操作介绍呢啊,我就已经给大家讲到这里,这里呢,那一元大墨插件的新手入门的这一篇呢,就已经是完结了。好了,那这期视频就到这里。

哈喽,大家好,因为很多人呢私信我这个多线程的排序,这个排空单怎么使用的?今天呢我就来快速来说明一下。首先这个版本跟前面的我们前面的加强版,独立产能版和升级版最大的区别,他的区别就是我们可以按照这个生产线来排单了,我们看下如果说把这两个都改成一号线, 那么这些订单呢,都会在一号线上共享产能,然后二号线订单是单独的独立产能,那这里可以看到这个订单已经在一号线上已经做了,来不及了,我想把它放到二号线上,那么我只要把这个改成二, 那这个才能订单就会从二号线开始。那另外又有人问我如何按照这个交期来进行一个排序,那么这个也非常简单,你只要选中这个区, 把它全部选中,按住 ctrl 加 shift 往下把所有地段全部选中,选中之后我们再开始这里有一个排 序,自定义排序,我们来先对这个 a 列就这生产线列进行排序,因为你还是要以生产线为主这个生序,然后再添加一个条件,这个呢就按照交期来排序,这个交期呢是在第四列就列第,然后呢也按照一个生序排序, 那现在可以看到一号线的订单都是按照娇妻的一个生序排序。好了,那二号线的订单也是按照一个生序的排序呢?全部都排好了, 那么还有人说我这边还有新添加一些列,该怎么办?如果你要插入列,你完全就可以手工,这样插入列对后面的公式都不会产生任何的影响啊,比如说这边你可以加一些什么订单描述啊,甚至可以这边输入公式,跟其他 其他的基础表连接在一起,都是没有任何影响的,删除也没关系。另外呢还有人问这个合格力我是不是可以不需要,因为我这边不需要这个合格力,然后我这边 数量呢是跟这个合格率相关的,那如果不需要的话,你也可以把它删除掉,因为后面这个牌子呢,是完全按照这个需生产数量来做的。所以这个合格率删掉之后,你只要改一下这个公式,我就应该是非常简单的,就是剪一剪,出一下,称一下这个合格率就可以了。 好,这个日产呢是可以手工更改,而且这个日产能跟这边的可用公式、计划公式是没有相关的。那么这个公式是什么用呢?你看现在是二十,我可以把它上下全部改成一百, 他这边输出也是没有关系,也不会产生变化的。那么什么意思?比如说我今天这边这个订单是四月二十一号开始,所以这边从四月二十一号开始,那么我如果说把这边改成五十, 就是我的计划公司呢?我一般来说我的产能是一百,就是我百分之百开产的,如果我改成五十,那么这一天我的产能就只剩下百分之五十了。为什么?因为我这边改 改成五十之后,我本来日产能是一百,就是把这个产能用光了,所以这一天他这里就用不了产能了。但是我这个二号线就跟这个这个产能是没有关系的。 那么就这么意思,那我如果再改一下,比如说我的产能只剩下百分之十,那么百分之十的话,我这边的产能是一千,百分之十的话就一百,那么就需要每做五天才能做出来,就这里的话我只能生产一百,我们来看一下 他就只剩下一百了,因为后一天才能是百分之一百吗?所以这边就可以做出来。好,我这边先把它改成百分之一百,那么如果说我这天是需要加班生产的,我们来看一下这边,如果我把它改一下,直接改成一千, 那么他可以全部做出来,那么我改成两千,他这句话就需要做两天才能做出来。那如果说我现在非常的感娇气,我把这个公式呢改成两百,这边我可能教更多的 来操作,就可以达到百分之两百,双倍的产量就可以把它给做出来了。另外呢还有人问我如果要插入一个订单怎么办?插入一个订单也是比较容易的,你就比如说我就把上面这一列,比如说这个订单,我把它复制一下,然后在这边点 插入复制单元格,这一列单元格的就是你刚刚插入的,然后呢你这边的东西可以手工的更改,比如这边的产订单,比如说是一万,然后这个订单数量也改成,比如说 a 三一,好,为了演示方便,我其他就不改了。 那主要呢就是这边的这公式,你只要复制这个单元格第一个单元格,然后把所有的公式全部复制到底,按下 ctrl 加密, ok, 他这样的就可以自动计算,自动更新好了,所以你要插入单元格呢,也是非常简单的。那最后这个实际开始是什么意思?就是说如果说你这个订单因为有些缺, 我必须得四月二十一号我才能开始,虽然我的产能呢,二十号就空了,那么可能这个缺掉,供应商那边又说,哎,二十一号我也交不了了,那就把它改成,比如说二十五号,那么这个订单就只能从二十五号开始。 如果说他这个郊区晚于你这个这个订单郊区的话,他这边是会显示一个红色的。好,那么谢谢观看,我们下期再见。

好,大家好,我是玉峰,欢迎大家收看本期 tiktok, 那么今天这个视频呢,我们将一起来看一下如何在 idea 当中进行多线程的锻炼调试。首先我们一起来看一下今天的这个代码逻辑,我这个地方有一个自定义的线程,然后我们看一下他的这个慢方法,首先是输出一段话啊,表明当前线程开始计算, 然后呢就会去调用他的这个 at 方法,在 at 方法里面呢,他做的一件事情非常的简单啊,就是你传入一个数,然后我们就从一累加直到你那个数结束啊,并且呢把这个结果返回出去。 好的,那么接下来呢,我们就来演示一下多线程代码的一个调试啊,首先比如说我们在这个 thread 点 choice 啊这个地方打一个断点,然后我们用断点调试的方式来运行他接下来我们讲的一个地方呢,是啊,第八个面板,他这个地方有一个 frames 选项卡啊,当我们把这个 frames 选项卡啊,这个下拉框点 开的时候呢,整个这个区域啊,他有一个学名叫 costack 啊,翻译成中文叫调用站。当前断点所在的这个县城呢,是闷方法啊,也就是这个主县城,对吧?与此同时啊,并发在运行的呢,是我们的这个 thread 一和这个 thread 二, 接下来我们让我们的这个程序继续走完,然后呢我们在这个地方给他右键点击一下这个断点啊,他这个地方会呼出一个啊,断点的一个配置小面板啊,第一个是 enable, 就是这个断点他生效不生效。 第二个是 suspend 啊,这个就是和现成相关了啊,第一个哦,表示所有的现成啊,只要执行到这段代码,那我都会去把它做一个挂起的操作。那么第二个 thread 啊,很显然它和现成有关啊,比如说你有多现成,那么我会一条线成一条现成的去把它挂 啊,这个地方我们选择了 thread 之后呢,它有一个 make default 啊,这样的一个按钮,当我们点击了这个 make default 按钮以后呢,我们后续所有打的断点都会以线程为单位啊,去执行,去挂起, ok, 这个地方我们不选择它,然后我们点击一个弹, 接下来我们再执行一下我们的这个程序啊,呃,那么这个时候呢,我就想问大家一个问题啊,你觉得这一次我们啊这个 costec 调用站当中啊,会有几个县城呢? 我们一起来看一下,嘿嘿,你会发现他只有一个闷啊,没有那个 thread 一,也没有那个 thread 二,因为当前执行到 thread 一点 join 这个方法啊,他其实所在的这个线程上下文呢,是我们的这个闷方法, 也就是这个主线城啊。接下来呢,我们再来调试一下这个乱方法当中的这个代码啊,我们把这个断点打在 在这一行, ok, 我们可以看到它这个地方有 thread 一,还有这个 thread 二,当我们进行啊,这个战争切换的时候呢 啊,比如说刚才我们这个 thread 一啊,你可以看到它这个地方变量的一些参数信息啊,是现成一的啊,这个地方 number 是一百,战争切换到 thread 二的时候呢,你可以发现啊,它这个地方 number 是等于一万,对吧? 但是这个并不代表我们做了一个切换啊,他的这个线程上下文就做了一个切换,比如说我们可以做这样的一个尝试,我们把这个 evaluate 就是运行时表达式解析的这样一个功能调调出来,对吧?然后我们复制一段话进去啊,就是我们想让这个系统打印一下当前正在执行的这个现场他是什么名字, 比如说现在我们把这个战争切换到了 thread r, 我们点一下这个 evaluate, 你会发现它的这个 result 打印出来的还是 thread 一,对不对?我们把这个 cost 点开啊,你可以发现这个地方打对勾的正是我们当前的这个运行的线程,就是 thread 一啊,然后我们把它切过来,再次点击一下这个 evaluate, 输入这行这个代码, 它确实是 thread 一,对不对?那么这个是什么原因呢啊?我们还是右键来看一下这个断点啊,我们可以看到它这个地方默认的 suspend 是 o 啊,也就是说我当前的这个断点执行或者说它的挂起是 和单独的线程没有任何关系的啊,谁先过来,我就先把这个上下文给他,对吧?然后接下来呢,我们就把这个哦切换成这个 threat 啊,点击一个弹好的,我们直接把这个 evaluate 面板打开,然后我们输入这个代码,然后 evaluate 当前我们的站 指向的是这个 thread 一啊,所以说他打印出来当前现场的名字是 thread 一,这个没有任何问题,对吧?我们把它去掉,然后我们把这个战针啊挪到这个 thread 二,我们点一下这个 evaluate 刚才那段代码复制过来,哎,你会发现这个就变成了 thread 二, 并且啊,并且你看他这个地方战争前面有一个对勾对不对?当你切换为 three 的一的时候呢,他的对勾就挪到了 three 的一,当你切换为这个 three 二的时候呢,他这个对勾就挪到了 three 的二。 所以说这个,呃,我们在调试多线程的时候,用这种呃基于线程挂起的方式有一个什么好处呢?就是它可以形成一个线程的啊,运行时的副本啊,线程与线程之间是互不干扰的,你可以通过切换线程来查看你的每一个线程,它执行的时候内在的一些啊,变化 啊,内在的一些信息啊,等等等等啊,这个是可以看得很清楚的。 ok, 那么以上呢,就是本期视频的一个全部内容了,如果大家觉得这个视频还不错的话呢,请帮忙点赞投币分享啊,一键三连支持我一下。 那么如果你还没有关注我的这个频道的话呢,也请你点一下关注啊,我这个频道是专注于程序员干货,视频教程分享和关爱程序员身心健康的这样一个频道。好的,我们下个视频再见吧, peace。