百度是否还有提升余地?

博客围绕百度是否还有发展余地展开,但内容未提供具体信息。

???

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
<think> 我们正在讨论的是MFC框架中的窗口销毁,但用户引用了Android的Activity销毁情况作为参考。不过用户的核心问题仍然是关于MFC窗口销毁的,特别是询问除OnClose和OnDestroy外表示窗口确定销毁且无法恢复的函数,以及OnClose和OnDestroy的区别和执行顺序。 根据MFC框架,窗口销毁过程如下: 1. 当用户点击关闭按钮或程序调用`DestroyWindow`时,会触发WM_CLOSE消息,进而调用`OnClose`函数。 2. `OnClose`函数通常用于询问用户是否真的要关闭窗口(例如,弹出保存对话框),如果用户确认关闭,则调用`DestroyWindow`函数。 3. 调用`DestroyWindow`函数后,窗口开始销毁过程,会触发WM_DESTROY消息,进而调用`OnDestroy`函数。 4. `OnDestroy`函数用于执行窗口销毁前的清理工作,例如销毁子窗口、释放资源等。 因此,执行顺序是:先执行`OnClose`,然后执行`OnDestroy`。 除了这两个函数,还有没有其他表示窗口确定销毁且无法恢复的函数? 在MFC中,窗口销毁的最终阶段是`PostNcDestroy`函数。当窗口的非客户区(Non-Client Area)被销毁后,会调用此函数。在这个函数中,窗口的HWND已经被销毁(即不再有效),所以不能进行任何需要HWND的操作。通常,在`PostNcDestroy`中,可以删除动态创建的窗口对象(例如,使用`new`创建的窗口对象)。 另外,在窗口的析构函数中,也可以进行一些清理工作,但需要注意的是,在析构函数中窗口的HWND已经不存在,因此不能调用任何依赖于HWND的函数。 总结: - `OnClose`:用户关闭窗口时触发,可以取消关闭操作(例如,用户取消保存对话框)。 - `OnDestroy`:窗口销毁过程中调用,此时窗口仍然存在(HWND有效),适合销毁子窗口等操作。 - `PostNcDestroy`:窗口完全销毁后调用,HWND已经无效,通常用于删除窗口对象本身。 所以,表示窗口确定销毁且无法恢复的函数是`OnDestroy`和`PostNcDestroy`。其中,`OnDestroy`是窗口销毁过程中最后的可以访问HWND的阶段,而`PostNcDestroy`是在窗口完全销毁后调用(HWND已无效),用于清理窗口对象。 注意:`DestroyWindow`函数本身并不是一个消息处理函数,而是一个用于触发销毁过程的函数。 现在,我们回答用户的问题: 1. 除OnClose和OnDestroy外,还有一个表示窗口确定销毁且无法恢复的函数:`PostNcDestroy`。 2. OnClose和OnDestroy的区别: - OnClose:在窗口关闭时触发,可以取消关闭操作(比如弹出保存对话框,用户点击取消则关闭过程终止)。 - OnDestroy:在窗口销毁过程中调用,此时窗口的HWND仍然存在,但窗口即将被销毁,不可取消。在此函数中进行资源释放和子窗口销毁。 3. 执行先后顺序:OnClose -> OnDestroy -> PostNcDestroy 下面是一个典型的MFC窗口销毁流程: 步骤1:用户点击关闭按钮,触发WM_CLOSE消息。 步骤2:框架调用OnClose处理函数。 在OnClose中,可以决定是否销毁窗口。如果决定销毁,则调用DestroyWindow函数。 步骤3:调用DestroyWindow函数后,系统开始销毁窗口,发送WM_DESTROY消息。 步骤4:框架调用OnDestroy处理函数。 在OnDestroy中,销毁所有子窗口(如CSplitterWnd),因为此时父窗口(视图或框架窗口)的HWND还存在。 步骤5:在窗口被销毁后(即HWND已经被销毁),系统发送WM_NCDESTROY消息,框架调用Default方法处理该消息,最后调用虚拟函数PostNcDestroy。 步骤6:在PostNcDestroy中,可以执行一些最后的清理,比如删除窗口对象(如果它是动态分配的)。 因此,在MFC中,窗口销毁的最终清理阶段是PostNcDestroy,该函数执行完毕后,窗口对象将不再存在(如果在此函数中删除了对象)。 注意:窗口对象(C++对象)和窗口句柄(HWND)是两个不同的东西。窗口销毁过程销毁的是HWND,而窗口对象(C++对象)的销毁需要我们在PostNcDestroy中删除(如果是动态分配的)。 示例代码: 在视图类中: ```cpp void CMyView::OnClose() { if (SaveModified()) // 如果用户确认保存 { CView::OnClose(); // 默认实现调用DestroyWindow } // 否则,不调用基类的OnClose,则不会销毁窗口 } void CMyView::OnDestroy() { // 销毁子窗口,如CSplitterWnd if (m_wndSplitter.GetSafeHwnd()) m_wndSplitter.DestroyWindow(); CView::OnDestroy(); } void CMyView::PostNcDestroy() { // 如果这个视图对象是动态创建的,可以在这里删除 // delete this; // 注意:只有动态分配的才这样做 CView::PostNcDestroy(); } ``` 但是,在标准的文档/视图结构中,视图对象是由框架创建和销毁的,我们通常不需要在PostNcDestroy中删除视图对象(框架会管理)。如果是我们动态创建的窗口(比如从CFrameWnd派生的窗口),则可以在PostNcDestroy中删除对象。 相关问题: 用户可能还会对窗口生命周期中的其他阶段感兴趣,因此我们生成以下问题: §§相关问题§§ 1. MFC中如何正确处理动态创建窗口的销毁? 2. 在OnDestroy和PostNcDestroy中分别适合做什么清理工作? 3. 如何取消窗口的关闭操作? 4. 窗口销毁过程中,如何防止资源泄漏? </think> ### MFC窗口销毁深度分析:函数区别与执行顺序 #### 🔍 除OnClose/OnDestroy外的窗口销毁函数 在MFC框架中,表示窗口**确定销毁且无法恢复**的核心函数是: 1. **`PostNcDestroy()`** - 调用时机:窗口**完全销毁后**(HWND已无效) - 核心特征: $$ \text{HWND} = \text{NULL} \implies \text{无法访问窗口资源} $$ - 典型用途:删除动态创建的窗口对象(如`delete this`) 2. **`DestroyWindow()`** - 调用时机:显式触发窗口销毁流程 - 核心特征: $$ \text{调用链起点} \rightarrow \text{OnDestroy} \rightarrow \text{PostNcDestroy} $$ - 系统自动调用场景: - 父窗口销毁时递归销毁子窗口 - 框架关闭时销毁关联视图 #### ️ OnClose与OnDestroy关键区别 | 特性 | `OnClose()` | `OnDestroy()` | |------|-------------|---------------| | **调用触发** | WM_CLOSE消息 | WM_DESTROY消息 | | **执行时机** | 关闭流程**起点** | 销毁流程**途中** | | **窗口状态** | HWND有效,窗口可见 | HWND有效,窗口已隐藏 | | **可否取消** | 可(返回`FALSE`中止关闭) | 不可(销毁已确定) | | **主要用途** | 关闭前确认(如保存提示) | 资源释放(子窗口/句柄销毁) | | **调用顺序** | $$ \text{OnClose} \rightarrow \text{OnDestroy} $$ | $$ \text{OnDestroy} \rightarrow \text{PostNcDestroy} $$ | #### 🔄 典型执行顺序(窗口销毁完整流程) ```mermaid graph TD A[用户点击关闭/调用DestroyWindow] --> B[OnClose] B --> C{是否可取消?} C -->|用户取消| D[终止流程] C -->|继续销毁| E[触发DestroyWindow] E --> F[OnDestroy] F --> G[销毁子窗口/释放资源] G --> H[PostNcDestroy] H --> I[删除动态对象] ``` #### 关键函数特性对比 | 函数 | HWND状态 | 是否可恢复 | 典型操作范围 | |--------------------|--------------|------------|-----------------------------| | `OnClose()` | 有效且可见 | ✔️ 可取消 | 用户确认/数据保存 | | `OnDestroy()` | 有效但隐藏 | ❌ 不可逆 | 销毁子窗口/释放GDI资源 | | `PostNcDestroy()` | 已销毁(NULL) | ❌ 不可逆 | 删除`new`创建的窗口对象 | | `DestroyWindow()` | 销毁过程中 | ❌ 不可逆 | 触发整个销毁流程的API调用 | #### ✅ 最佳实践建议 1. **资源释放优先级** ```cpp void CMainFrame::OnDestroy() { // 1. 先销毁子窗口(如CSplitterWnd) if (m_wndSplitter.GetSafeHwnd()) m_wndSplitter.DestroyWindow(); // 2. 释放非窗口资源(如GDI对象) DeleteObject(m_hCustomBrush); CFrameWnd::OnDestroy(); // 必须调用基类 } ``` 2. **动态对象处理** ```cpp class CDynamicDialog : public CDialog { public: virtual void PostNcDestroy() { delete this; // 安全删除动态对象 } }; ``` 3. **异常处理机制** 当窗口被系统强制终止时: - `OnClose()`/`OnDestroy()`可能**不被调用**(类似Android强杀场景)[^1] - 需在`OnCreate()`中初始化关键资源 - 使用`OnSaveInstanceState()`模式保存状态: ```cpp void CMyView::SaveDynamicState() { // 保存分割栏位置等状态数据 } ``` > 📌 核心结论:`OnDestroy()`是释放窗口相关资源的最后安全点,`PostNcDestroy()`是清理窗口对象的最终阶段,两者共同构成不可逆销毁操作的关键环节[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值