SDL调试心得(MFC SDL 窗口放大后 画面卡死)

C++窗口编程实战:从Win32消息循环到跨进程嵌入与多线程UI 在Windows桌面开发中,图形用户界面(GUI)编程是构建交互式应用的核心。其底层原理基于事件驱动模型,通过消息循环机制实现用户输入与界面响应的解耦。这一机制的技术价值在于提供了高效、异步的UI交互基础,是Windows平台所有GUI框架(如MFC、Qt)的基石。在工程实践中,开发者常需处理复杂的应用场景,例如实现插件化架构时的跨进程窗口嵌入,或为保持界面流畅而引入的多线程后台任务。针对“c++ qt 窗口跨进程嵌入到chrome官方浏览器后 按钮无法点击”这类典型问题,其根源在于Windows的消息传递 阅读详情

转自:http://blog.youkuaiyun.com/u011430225/article/details/53170956


收藏了这篇文章,因为这两个问题我都碰到了!

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

来源:http://www.cnblogs.com/lihaiping/p/4324315.html



今天在项目中用到SDL2.0的库做视频显示用,在其中出现不少问题,这里一一记录下来,并作为以后的参考。

 

同一个窗口句柄在多次使用SDL_CreateWindowFrom和SDL_DestroyWindow以后,发现程序运行正常,但视频显示不出来的问题。

第一次将Hwnd传递给SDL_CreateWindowFrom,创建一个显示窗口给SDL,随后在不使用的时候,调用SDL_DestroyWindow,将刚刚创建的显示窗口销毁,释放显示相关资源之后,然后在再次使用SDL_CreateWindowFrom的时候,将同一个句柄传递给SDL_CreateWindowFrom,返回成功,后续的操作也全部正常进行,但视频在窗口上始终显示不出来。

对于其中的原因,我找了好久,后面从SDL的源码中才慢慢推测并怀疑一些问题,SDL源码如下:

复制代码
 1 void
 2 SDL_DestroyWindow(SDL_Window * window)
 3 {
 4     SDL_VideoDisplay *display;
 5 
 6     CHECK_WINDOW_MAGIC(window, );
 7 
 8     /* Restore video mode, etc. */
 9     SDL_HideWindow(window);/*注意这个地方哦*/
10 
11     /* Make sure this window no longer has focus */
12     if (SDL_GetKeyboardFocus() == window) {
13         SDL_SetKeyboardFocus(NULL);
14     }
15     if (SDL_GetMouseFocus() == window) {
16         SDL_SetMouseFocus(NULL);
17     }
18 
19     /* make no context current if this is the current context window. */
20     if (window->flags & SDL_WINDOW_OPENGL) {
21         if (_this->current_glwin == window) {
22             SDL_GL_MakeCurrent(window, NULL);
23         }
24     }
25 
26     if (window->surface) {
27         window->surface->flags &= ~SDL_DONTFREE;
28         SDL_FreeSurface(window->surface);
29     }
30     if (_this->DestroyWindowFramebuffer) {
31         _this->DestroyWindowFramebuffer(_this, window);
32     }
33     if (_this->DestroyWindow) {
34         _this->DestroyWindow(_this, window);
35     }
36     if (window->flags & SDL_WINDOW_OPENGL) {
37         SDL_GL_UnloadLibrary();
38     }
39 
40     display = SDL_GetDisplayForWindow(window);
41     if (display->fullscreen_window == window) {
42         display->fullscreen_window = NULL;
43     }
44 
45     /* Now invalidate magic */
46     window->magic = NULL;
47 
48     /* Free memory associated with the window */
49     SDL_free(window->title);
50     SDL_FreeSurface(window->icon);
51     SDL_free(window->gamma);
52     while (window->data) {
53         SDL_WindowUserData *data = window->data;
54 
55         window->data = data->next;
56         SDL_free(data->name);
57         SDL_free(data);
58     }
59 
60     /* Unlink the window from the list */
61     if (window->next) {
62         window->next->prev = window->prev;
63     }
64     if (window->prev) {
65         window->prev->next = window->next;
66     } else {
67         _this->windows = window->next;
68     }
69 
70     SDL_free(window);
71 }
复制代码

从上面的代码,我开始怀疑是不是在调用SDL_DestroyWindow以后,SDL将窗口给隐藏了,导致在上面显示视频的时候,始终显示不出来的问题。

于是我在自己的测试代码中加入如下语句,在调用SDL_DestroyWindow以后,我一句:

vDisplay.ShowWindow(SW_SHOWNORMAL);//想显示窗口给显示出来,show出来
其中vDisplay对应于显示的窗口控件对象。

 在测试的项目代码中加入这行代码以后,就完美的解决了项目的问题。

=============================================================

问题2:

当我在MFC的UI消息相应函数中创建显示窗口的一些相关资源,在后台创建的单独线程,用于刷新和更新显示数据,然后在UI的关闭消息响应中释放和销毁SDL窗口相关资源。

问题来了,当我使用全屏的时候,出现了后台更新数据线程一直报错:

复制代码
 1     if(o_pSdlHelper->SDL_RenderClear(pDispContext->pStruOut->pRender)<0)
 2     {
 3         char outstr[200]={0};
 4         const char *pbuf=o_pSdlHelper->SDL_GetError();
 5         _snprintf(outstr,sizeof(outstr),"%s \n",pbuf);//这里出错信息为:Reset(): INVALIDCALL
 6         OutputDebugStringA(outstr);
 7         memset(outstr,0,sizeof(outstr));
 8 
 9         return PCI_MC_UNKNOWN_ERR;
10     }
复制代码

这就让我奇怪了,之前我全屏的时候,没有错误啊,现在为什么有错?而且显示窗口画面也没有显示刷新了!!

于是我想了下和之前的代码有什么不同,唯一的不同在于,我调用创建窗口和创建渲染,纹理等等这些操作等资源放在了和更新数据的同一个线程中,没办法,不知道原因,只有改回原来的代码,将创建的代码从UI消息响应中调入和后台刷新数据同一个线程中。结果奇怪的是,居然这样全屏操作能运行?

见鬼了,这是啥原因?

//这个原因,还有待查证相关资料和SDL源码才能知道。暂时解决了,但不知道原因何在。

=========================================

最近使用sdl老是出现莫名其妙的错误,后面从sdl源码中知道:

https://bugzilla.libsdl.org/show_bug.cgi?id=1995

 

 

/////////////////////////////////////////////////////////////////////////////////////////

sdl做视频显示的时候,在不断调整窗口大小的时候,会出现sdl崩溃,后面跟踪发现崩溃在sdl的windowsizechange消息,render->updateview这个函数上.

不过这个崩溃,貌似也只是会在部分机器上崩溃,具体原因还不得而知,但目前我的解决方法是sdl的消息响应处理函数给注释掉了:

复制代码
 1 #ifdef GWLP_WNDPROC
 2 data->wndproc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
 3 if (data->wndproc == WIN_WindowProc) {
 4 data->wndproc = NULL;
 5 } else {//modefy by lhp-20150720
 6 //SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WIN_WindowProc);
 7 }
 8 #else
 9 data->wndproc = (WNDPROC) GetWindowLong(hwnd, GWL_WNDPROC);
10 if (data->wndproc == WIN_WindowProc) {
11 data->wndproc = NULL;
12 } else {//modefy by lhp-20150720-注释这个sdl消息接管函数
13 //SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR) WIN_WindowProc);
14 }
15 #endif
复制代码

出自:http://www.cnblogs.com/lihaiping/p/4324315.html 

分类:  SDL


Visual C++游戏编程:从底层原理到现代实践的深度解析 在Windows平台软件开发领域,理解底层系统机制是构建高性能应用的基础。通过分析C++编译原理与Windows SDK的紧密集成,开发者可以深入掌握内存管理、多线程调度及图形接口(如GDI/DirectX)的核心工作方式。这种底层认知对于游戏开发、图形引擎和高性能计算场景具有重要价值,能够帮助开发者优化资源分配、提升渲染效率并精准定位系统级问题。本文以Visual C++为工具,结合Microsoft Visual C++ Redistributable等运行时环境的热点话题,剖析经典游戏项目源码,展现从 阅读详情

相关推荐

C++面向对象编程实战:从零构建扑克牌游戏项目

面向对象编程(OOP)是软件工程的核心范式,它通过封装、继承和多态三大特性,将现实世界实体抽象为类与对象,从而构建出模块化、可复用、易维护的代码结构。其原理在于将数据与操作数据的方法绑定,并通过类之间的层次关系实现代码的扩展与特化。这一技术价值在于显著提升了大型项目的开发效率与代码质量,是构建复杂系统(如游戏引擎、图形界面应用)的基石。在游戏开发这一典型应用场景中,OOP能完美建模游戏实体及其交互逻辑。本文以C++实现扑克牌游戏为例,深入探讨如何运用STL容器进行高效的数据管理,并利用enum class实

393

(原)SDL调试心得

今天在项目中用到SDL2.0的库做视频显示用,在其中出现不少问题,这里一一记录下来,并作为以后的参考。 同一个窗口句柄在多次使用SDL_CreateWindowFrom和SDL_DestroyWindow以后,发现程序运行正常,但视频显示不出来的问题。 第一次将Hwnd传递给SDL_CreateWindowFrom,创建一个显示窗口给SDL,随后在不使用的时候,调用SDL_De...

dianchixian5277的博客 561

VC++实现USB通信:WinUSB驱动安装与异步数据收发实战

USB通信是计算机与外部硬件设备进行数据交换的基础技术之一,其核心原理是通过标准化的协议和接口实现主机与设备之间的可靠数据传输。在Windows平台下,开发者可以通过系统提供的API直接与USB设备交互,实现对硬件的底层控制,这对于需要高实时性和低延迟的应用场景(如工业控制、数据采集)具有重要技术价值。WinUSB作为微软官方推荐的用户模式驱动框架,为开发者提供了简洁高效的编程接口,避免了编写复杂内核驱动的高门槛。通过结合重叠I/O(Overlapped I/O)技术,可以构建异步非阻塞的数据收发引擎,确保

weixin_34101784的博客 409

SDL2 简明教程(五):OpenGL 绘制

接下来进行代码示例说明,下面的示例中使用 OpenGL 绘制了一个 三角形。关于 OpenGL 如何使用请参考。

记录学习的过程 4137

Windows Mobile下SQLite的Native C++轻量封装实践

SQLite作为嵌入式场景中最主流的轻量级关系型数据库,以其零配置、事务安全、单文件部署等特性,广泛应用于资源受限的工业终端设备。其底层基于C语言实现,天然适配Native开发,但在Windows Mobile这类已终止支持的嵌入式平台中,需直面ARMv4T指令集兼容、wchar_t编码转换、内存确定性管理及线程安全模型重构等核心挑战。本文聚焦SQLite在WM平台的本地化落地,深入解析C API直接封装、源码级编译适配、BOM敏感字符串处理、CriticalSection双重加锁等关键技术路径,为遗留系统

dianlu5775的博客 381

C语言调用Windows API实现声音播放:从Beep到PlaySound的完整指南

在Windows系统编程中,系统调用是应用程序与操作系统交互的核心机制,它允许程序访问底层硬件和系统服务。通过调用Windows API,开发者可以控制计算机的音频输出设备,实现从简单的蜂鸣声到复杂音频文件的播放。这一技术为控制台程序提供了非文本的交互反馈方式,在调试提示、任务完成通知等场景中具有实用价值。本文聚焦于C语言环境下如何调用Beep、MessageBeep和PlaySound等核心API,详细解析其参数配置、硬件依赖和常见问题排查方法,帮助开发者快速掌握这一基础但实用的编程技巧。

weixin_30299709的博客 457

SDL-2.0.17 播放视频改变窗口大小后崩溃问题

解码视频流后调用SDL动态库渲染窗口,拖拽窗体改变窗口大小程序崩溃。 修改SDL源码如下: 修改SDL_OnWindowResized中的SDL_WINDOWEVENT_SIZE_CHANGED更改为SDL_WINDOWEVENT_RESIZED 然后重新编译,放入项目中。 重新播放视频拖拽窗口不再崩溃 ...

qq_21957193的博客 1299

VC2010 Express中文版:面向教学与工控的轻量C/C++开发环境

Visual C++ Express是微软推出的免费C/C++集成开发环境(IDE),专为初学者和轻量级原生开发设计。其核心原理在于功能裁剪与场景聚焦——保留标准C++98/03语法、Win32 API支持和图形化调试能力,同时移除MFC可视化设计器、64位编译器等企业级组件,显著降低学习与部署门槛。技术价值体现在本地化深度适配:不仅界面汉化,更涵盖错误提示术语统一(如‘断点’‘调用堆栈’)、MSDN帮助信息密度优化及编译器错误码中文映射,切实提升新手理解效率。典型应用场景包括高校《程序设计基础》教学、工业

weixin_42527654的博客 354

SDL2嵌入控件播放导致崩溃,系统锁屏触锁后不刷新

现象: 使用MFC及C#控件进行视频流或录像文件的播放app, 问题: 1.对控件进行放大缩小后,界面不刷新。 2.当对运行APP的系统进行锁屏再解锁后或远程连接或切换用户后,相应的图像控件界面不刷新。-严重 方法: 问题1:控件缩放刷新问题,SDL_SetWindowPosition函数不起作用,是窗口渲染器和纹理后不再匹配,此时需要重新创建再进行绘制更新。SDL_CreateRenderer(),SDL_CreateTexture()再次创建。 问题2: 简单的方法是监听解锁后的消息..

jiangli198867的专栏 1226

CEF Chromium 90 64位:桌面应用嵌入浏览器内核的实战指南

在桌面应用开发中,嵌入现代浏览器内核已成为实现混合架构、复杂H5交互或客户端套壳的常见需求。浏览器内核作为底层渲染引擎,决定了应用的Web标准兼容性、性能表现与安全边界。Chromium Embedded Framework(CEF)正是这样一套将Chromium内核封装为SDK的成熟方案,让开发者能够在C++、C#等环境中无缝集成。面对诸如cef_binary_90.5.9+chromium-90.0.4430.85_windows64这样的发行包,理解其版本号构成、目录结构、x64平台差异化以及多进程与

weixin_30455023的博客 391

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9453

SDL2在子线程中SDL_DestroyWindow时发生阻塞

void SDL_DestroyWindow(SDL_Window * window) { SDL_VideoDisplay *display; CHECK_WINDOW_MAGIC(window,); window->is_destroying = SDL_TRUE; /* Restore video mode, etc. */ //SDL_HideWindow(window); /* Make sure this window no longe

asdasfdgdhh的博客 971

【视线追踪】视线追踪的性能评估框架 及 基础知识

文章目录一、 前言二、 眼球追踪基础1. 眼动类型研究2. 基本设备3. 校准 calibration4. 眼球视线和头部姿态的关系5. 视线追踪精确度的评估三、 视线估计算法1. 基于2维回归2. 基于3D模型1) 单摄像头2) 多摄像头3. 基于交叉比4. 基于外观5. 基于眼睛形状的方法四、 实现估计的应用1. 电脑2. 电视3. 头戴设备4. 汽车5. 手持设备6. 设备配置五、 视线追踪的性能指标和错误原因1. 不同平台之间差异性很大2. 影响视线追踪可用性的因素六、 视线追踪系统的性能评估框架1

火火的博客 5308

VC++ 2010完整安装与C语言开发环境配置指南

C语言作为编程入门和计算机等级考试的核心语言,其开发环境的搭建是学习的第一步。Visual C++ 2010作为一款经典的集成开发环境,因其稳定性和与教学体系的深度绑定,至今仍在高校教学和考试中被广泛采用。理解其安装原理和配置逻辑,不仅能确保代码编译的准确性,更能帮助初学者建立规范的工程管理思维。本文聚焦于VC++ 2010学习版的安装流程、环境配置及第一个C程序的创建,通过详解项目创建、编译链接和调试技巧,旨在为初学者构建一个稳定、高效的编程实验台,并深入探讨了如何通过配置编译器警告等级、管理包含目录等操

weixin_30684743的博客 581

GT-suite v2016的下载和安装

1 写在前面 GT-suite 是一款用来做内燃机仿真的软件。在安装过程中遇到很多问题,网上的安装教程也大都抄来抄去,试着安装了几遍都没有成功。最终在贴吧一个老哥的帖子里找到了解决办法,但是老哥的帖子也不是很详细,所以做了这个详细版本的教程。 GT-suite v2016安装包: 链接:https://pan.baidu.com/s/1JZPgJ8_-J-L8rV84-eHedQ 提取码:uj...

kisssshot的博客 2万+

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

VC++ 6.0深度解析:从MFC框架到遗留系统维护实战

C++作为面向对象编程的核心语言,其编译链接机制和内存管理原理是构建大型软件系统的基石。在Windows平台开发中,理解底层API调用和框架设计对于开发高性能、高稳定性应用程序至关重要。MFC(Microsoft Foundation Classes)框架作为早期Windows C++开发的事实标准,通过文档/视图架构和消息映射机制,极大地提升了GUI应用程序的开发效率。对于工业控制、嵌入式上位机等领域的遗留系统,掌握VC++ 6.0这一经典开发环境,不仅能深入理解PE文件格式、多线程同步等底层技术,更能实

weixin_33853827的博客 393

基于树莓派4B设计的厨房环境监测系统_368

本项目设计并实现了一种基于树莓派4B的厨房环境监测系统,提升厨房使用过程中的安全性与智能化水平。系统采用树莓派4B作为主控核心,集成DHT11温湿度传感器、MQ2烟雾传感器、火焰传感器、光敏传感器、水滴检测传感器等多种传感器,实现对厨房环境温湿度、烟雾、火焰、光照与溢水等参数的实时监测,并通过蜂鸣器进行本地报警。系统通过WIFI连接互联网,利用MQTT协议将环境数据上传至华为云物联网平台,实现远程可视化监控。

415

Visual Studio 2022迁移VC6图像处理项目:BMP解析、卷积滤波与运行库配置实战

图像处理作为计算机视觉与图形学的基础,其核心在于对像素数据的直接操作与数学变换。从原理层面,图像由像素矩阵构成,通过卷积核在空间域进行滤波运算,可实现模糊、锐化、边缘检测等效果,这是理解更高级计算机视觉算法的基石。在工程实践中,处理遗留代码库是开发者常面临的挑战,特别是涉及编译器迁移和运行库依赖问题。本文以经典的Visual C++ 6.0图像处理项目迁移至Visual Studio 2022为场景,深入探讨如何解决“microsoft visual c++ redistributable”依赖错误,并解析

weixin_34355559的博客 366

android13删除录屏权限提示框-去除录屏提示

在Android 13中,当应用请求屏幕录制权限时,系统会弹出一个权限提示框,要求用户明确授权。这个提示框是为了增强用户隐私保护,让用户知道有应用尝试录制屏幕。但是,在某些情况下,开发者可能希望避免显示这个提示框,以提供更流畅的用户体验。本文将介绍如何在Android 13中删除录屏权限提示框。

zhutoubenben的专栏 1880

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

Dev-C++图形化五子棋开发:从EasyX界面到AI算法实战

图形用户界面(GUI)是人机交互的核心,它通过可视化控件将程序功能直观呈现给用户。其实现原理通常基于事件驱动模型,由操作系统捕获用户输入并触发相应回调函数。在C/C++开发中,选择合适的图形库能极大简化GUI开发流程,提升工程实践效率。EasyX作为一款轻量级图形库,封装了Windows GDI底层细节,提供了简洁的绘图API,特别适合初学者快速上手图形编程。通过将图形界面与游戏逻辑结合,开发者可以深入理解事件处理、坐标转换等关键技术。本项目以五子棋游戏为应用场景,演示了如何利用Dev-C++配合EasyX

weixin_30550081的博客 317

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多线程SDL_DestroyWindow阻塞问题

来源:http://bbs.youkuaiyun.com/topics/392273728 运用多线程实现播放器,用ffmpeg解码sdl显示,在停止播放销毁窗体SDL_DestroyWindow时发生阻塞。 以下是部分代码: C/C++ code ? 1 2 3 4 5 6 7 8 9 10

路楷的专栏 2250

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

基于SDL的opengl es的骨架代码

基于SDL的opengles骨架模板

a563501734的博客 812

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Windows 下openssl安装与配置
下一篇: 解决visual studio回车键代码补全
forfuture3513
博客等级 码龄15年 76粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值