cpu-time 相关问题


基于 OpenMP 的 Pytorch 与 CUDA 扩展

我尝试使用libtorch和OpenMP开发pytorch扩展。 当我测试我的代码时,它在 CPU 模型中运行良好,大约需要 1 秒才能完成所有操作: s = 时间.time() adj_矩阵 =


使用 tokio::spawn 函数未执行

这段代码: 使用 std::thread::sleep; 使用 std::time; 使用 std::sync::atomic::{AtomicU32,排序}; 使用 tokio::time::Duration; 静态REQUEST_RECV_V2:AtomicU32 = AtomicU32::new(0); 异步 fn no_msg_p...


java.lang.NoClassDefFoundError:解析失败:Ljava/time/Instant;

目前,我无法解决 java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/Instant; 的崩溃问题Android 7.1.1 (Nougat) 及更低版本会发生此类崩溃。但我的奥利奥...


在 Rayune 上使用 GPU 或 CPU

我的机器中有 1 个 GPU 和 32 个 CPU。 Ray 中可以单独使用它们吗?例如,一个任务分配有 1 个 CPU,另一任务分配有 1 个 GPU? 如果我使用 调.运行(


CPU架构8085和8086(以及基于8086的CPU)有何区别和分类? [已关闭]

阅读intel创建的CPU的不同谱系,我的脑海中浮现出许多需要解决的问题。问题如下: 就两者的差异而言


无法使用cgroup v2隔离CPU

我正在努力为基准测试创造一个稳定的环境 所以我需要隔离cpu(没有其他进程使用隔离的cpu) 我无法使用 cset(仅适用于 cgroup v1)并且无法使用 isolcpus (


信息:为 CPU 创建 TensorFlow Lite XNNPACK 委托

信息:为 CPU 创建了 TensorFlow Lite XNNPACK 委托。 我在运行 OpenCV 程序时得到此输出。请提供解决此问题的方法。


如何限制vmmem进程的CPU

在 Windows 10 机器中,我安装了需要 WSL2 的 Rancher Desktop。 每当我启动 Rancher Desktop 时,vmmem 进程都会启动高 CPU 利用率并达到 100%。我看到了


在arm64 M1 CPU上构建'node-canvas'时出错

我在配备 M1 CPU 的 Mac 上遇到以下错误: 我无法使用“node-canvas”npm 包构建 nodejs 应用程序,因为错误:dlopen(/Users/..../node_modules/canvas/build/Release/canvas.node,


PE.results 输出的PanelMatch 包问题

我正在尝试估计任命大学领导(appointed_new)对大学绩效(growth_f)的影响,我运行以下代码: PM.结果 <- PanelMatch(lag = 4, time...


如何正确导入polls-lts-cpu

我想使用 python 包 Polars-lts-cpu,因为我在 gitlab 运行器上面临一些硬件问题。如何在 Python 中导入这个包,即别名是什么? 一个简单的导入波尔...


指标服务器在一个节点上显示未知

它恰好发生在我今天添加到集群中的 almalinux 9.0 服务器上。 k8s 版本是 1.19.16 名称 CPU(核心数) CPU% 内存(字节) 内存% k8s-dev-node1 110m 11% ...


文本输入时 SwiftUI 100% CPU + 1 MB 内存

TLDR:当在表单中聚焦 TextField 或 TextEditor 时,每次击键都会占用 100% CPU 长达一秒(然后返回到零),并且总内存会增加近 1 MB(并且不会出现...


使用 `ggsurvfit::ggsurvfit()` 绘制对数减对数图

是否可以使用 ggsurvfit::ggsurvfit() 生成对数减对数图? 这是我想要生成的示例: 库(ggsurvfit) 温度 <- survfit2(Surv(time, status) ~ adhere, data =


使用 AMQP 注释的 ActiveMQ Artemis 重新交付延迟

在artemis中,当使用AMQP时,有一个注释表明您希望稍后发送消息,称为x-opt-delivery-time https://activemq.apache.org/components/artemis/


easyocr 仅在 Windows 上无法与 cpu 一起工作

我在带有gpu和cuda的计算机上成功使用了easyocr,但现在我也必须在只有cpu的机器上使用它。 按照 https://www.jaided.ai/easyocr/ins 的安装指南进行操作后...


定义一个索引,每次在r数据表中的某一列中找到相同值时该索引增加

我有一个如下所示的data.table: 例子 <- data.table(time = 1:30, A = c(rep("a", 5), rep("b", 5), rep("a", 5), r...


mqsvc.exe 在将 nservicebus 部署到生产环境时将 cpu 固定在完全使用状态

当我将使用 nservice 的站点部署到新的生产环境时,速度慢得无法使用...... 经过一番调试,我发现 mqsvc.exe 占用了 50% 的 CPU 使用率,另外 50% 是


在 Perl 中转换包含时区的时间戳

我需要将以下包含 ms 和时区的时间戳转换为 yyyy-mm-dd 格式: 使用时间::件; 我的 $created = "2024-07-02T11:20:11.000+0200"; 我的 $test2 = Time::Piece->strptime($


Google Meet 如何显示 CPU 使用情况?

我今天在 Chrome 中注意到了这一点。 Google Meet 在其“故障排除”面板中显示了 CPU 使用情况图表。我想知道是否有现有的 API 可以实现这一点,或者这是一个聪明的技巧......


如何在 Rust 中惯用地实现重要的类型状态模式?

我正在尝试构建一个简单CPU的FSM,它由大约40个状态组成,带有循环,以及跨整个CPU状态的许多变量的许多条件。这个 FSM 的运行就像一个简单的 Tur...


自定义 Weblogic HTTP 扩展日志记录格式

当前在我的 weblogic 服务器中我已启用 HTTP 日志记录。以下是当前配置。 格式为“扩展”。 扩展日志格式字段为“日期时间 cs-method cs-uri sc-status time...


如何将viz.visualize_image_attr的返回保存为图像Python

我需要使用的返回值 viz.visualize_image_attr(fa_attr_without_max[0].cpu().detach().permute(1, 2, 0).numpy(), sign="all", title="积分梯度") 作为图像...


使用 ClickOnce Publishing 时未安装 libvlc 文件夹

我有一个使用 VideoLAN.LibVLC.Windows 和 LibVLCSharp.Winforms NuGet 包的 WinForms .NET 4.8 Visual Studio ClickOnce (平台=任何 CPU)应用程序。 更新到最新版本后(3...


Redis HMGET 命令的性能问题

在生产环境中使用Redis HMGET命令检索数据时,如果命令中包含的key数量超过10000个,且请求量较大,CPU占用率


非常简单的 torch.tensor().to("cuda") 给出 CUDA 错误:设备端断言触发

我所做的就是, device = torch.device("cuda" if torch.cuda.is_available() else "cpu") torch.tensor([123,123]).to(设备) 我得到: 运行时错误:CUDA 错误:设备端断言


在SLURM中,lscpu和slurmd -c不匹配。所以资源无法使用

当我检查代码“lscpu”时,它显示 架构:x86_64 CPU 操作模式:32 位、64 位 地址大小:45 位物理地址,48 位虚拟地址 字节...


用于阻塞(CPU 密集)任务的异步函数?

我在 Swift 中有一个缓慢的阻塞函数,我想以非阻塞(异步/等待)方式调用它。 这是原始的阻止代码: // 原来的 func TotalSizeBytesBlocking() -> UInt64 { 变种


为什么这个共享库没有被链接?

我正在尝试使用 GPUocelot 在 X86 cpu 上生成 GPGPU 基准测试的痕迹。因此,我使用 -locelot 和 -locelotTrace 链接器标志编译基准测试。我的基准编译并


Fastparse 的简单规则内存不足

我使用 fastparse 库编写了以下解析器来成对获取单词。在执行时,它会使用 parsePair 正确进行解析。但对于 parseMultiPairs,它会进入 100% CPU 使用率,然后使用


QEMU/virt64 vGIC dist 和 CPU 接口地址

我正在使用 QEMU/virt64 (armv8),我有一个与在 EL2 模式下运行的虚拟机管理程序的 IRQ 注入相关的问题。 首先,vGIC分配器地址是0x08000000是否正确,我......


如何提高 GCP 中的级联湖 vCPU 速度(3.1 至 3.8 GHz)

我们采用了GCP C2(计算优化)类型的ubuntu机器,具有4vcpu,16-G RAM,200G SSD,其中装有intel Cascade Lake CPU。谷歌文档表明其速度为 3.8Ghz,但是机器


协调 C++ 和 Objective-C 中结构的填充

我使用 Objective-C 和 Metal 渲染到窗口,但是我的所有应用程序代码都是用 C++ 编写的。因此,CPU 对 MTLBuffer 内数据的所有操作都是用 C++ 完成的。这是由


如何让tensorflow keras使用我的GPU?

我正在尝试在张量流中使用keras来训练CNN网络以进行某些图像分类。显然,在我的 CPU 上运行的训练非常慢,所以我需要使用我的 GPU 来进行训练......


为什么 std::sleep_for(std::chrono::hours::max()) 在 Linux 上立即返回?

我正在运行一个提供服务的 C++ 程序,并注意到即使不提供任何请求,它也会占用 100% 的 CPU。我将问题缩小到一个 while 循环,该循环调用 std::sleep_...


为什么属于同一物理核心的两个逻辑核心频率不同?

CPU开启Turbo模式时,工作频率会随着工作负载的变化而波动。我通过turbostat命令观察到每个核心在运行期间都有不同的频率...


带有 AND 运算符的 if 条件和 helm 中的大于条件

我正在尝试为CPU设置一个默认值,如果它提到的(如果没有提到,我已经单独处理了)值文件中的值小于5000m。我正在尝试这个,但我不认为我...


获得一个非常简单的 stablebaselines3 示例来工作

我尝试模拟最简单的抛硬币游戏,你必须预测它是否会成为正面。遗憾的是它不会运行,给我: 使用CPU设备 回溯(最近一次调用最后一次): 文件&q...


除了线程池还有其他方式吗?

我为我的 MMORPG 在线游戏编写了一个代码,我注意到它会导致一些尖峰/延迟,并且功耗和 CPU 持续很高。 基本上我制作了假玩家。每个“机器人”的行为就像 p...


12字节长的double如何放入64位寄存器中?

我们假设内存中有一个long double变量。根据我在网上找到的信息,它有 12 字节大。如果寄存器大小是64位,CPU如何对其进行操作?是否以某种方式划分?


已使用内存,但我看不到使用它的进程(Debian)

这是我的问题: 顶部 - 11:32:47 至 22:20,2 位用户,平均负载:0.03、0.72、1.27 任务:总共 112 个,1 个正在运行,110 个正在睡觉,1 个已停止,0 个僵尸 CPU:0.0%us、0.0%sy、0.0%ni、100.0%...


并行作业同时在 E 和 P 核心上运行

我运行的大多数Python程序都使用多处理模块来将工作负载分配到整个CPU上。在带有 E 核心的较新的英特尔机器上,较慢的核心是否会影响我的性能,如果......


pthread_rwlock_wrlock 用于实时线程内部导致挂起,你为什么要活着?

#我的问题:# 1、我创建两个线程,一个实时线程,一个普通线程;两个线程都有读写锁,我们将两个线程绑定到一个CPU核上运行; 2. 两个线程会挂起,有一个...


使用部分进行主动拆解/重新渲染不会重新渲染部分

这是小提琴(对警报感到抱歉)http://jsfiddle.net/PCcqJ/92/ var ractive = new Ractive({ 模板:'#templateOne', 部分:{ aPartial:'哦,看,partia... 这是小提琴(抱歉有警报)http://jsfiddle.net/PCcqJ/92/ var ractive = new Ractive({ template: '#templateOne', partials: { aPartial: '<div>Oh look, the partial is rendered!</div>' } }); function cb() { alert('but now we unrender'); ractive.once('complete', function() { alert('we rendered again, and now you can\'t see the partial content'); }); ractive.render('container'); } ractive.render('container'); ractive.once('complete', function() { alert('so we render the first time, and you can see the partial'); ractive.unrender().then(cb); }); 此处的部分不会重新渲染。为什么是这样?部分仍在部分对象中,并且它们尚未渲染,那么什么会阻止它们再次渲染? 这个小提琴会渲染、取消渲染,然后重新渲染,每次发生其中一种情况时都会向您发出警报。 我做了一个工作jsfiddle:https://jsfiddle.net/43gLqbku/1/ <div id='container'></div> <script id="templateOne" type="x-template"> {{>aPartial}} </script> var ractive = new Ractive({ el:"#container", template: '#templateOne', partials: { aPartial: '<div>Oh look, the partial is rendered!</div>' } }); function cb() { alert('but now we unrender'); ractive.once('complete', function() { alert('we rendered again, and now you can\'t see the partial content'); }); ractive.render('container'); } //ractive.partials.part = '<div>this is a partial</div>'; ractive.once('complete', function() { alert('so we render the first time, and you can see the partial'); ractive.unrender().then(cb); }); 在调用render之前需要调用ractive.once('completed') 你不需要 ractive.render("container");在活动代码下,因为它在第一次运行时自动呈现 在你的jsfiddle中你导入的ractive不起作用 你没有在 jsFiddle 活动代码中包含 el:"#container"


在PHP中打印文件修改时间ISO-8601格式[重复]

我试图回显文件的上次更新时间并将其显示为 ISO-8601 时间戳格式。我尝试了一些命令,但它们没有获得正确的上次修改日期。 我试过: 我正在尝试 echo 文件的上次更新时间并将其显示为 ISO-8601 时间戳格式。我尝试了一些命令,但它们没有获得正确的上次修改日期。 我尝试过: <?php echo date("c"); ?> 但它只获取当前服务器时间,就像2024-01-11T11:39:33+02:00一样,它总是在变化。与date('c', time())相同。 以下两个似乎得到以下日期:1970-01-01T02:00:00+02:00: $lastmod = date('Y-m-dTH:i:s+00:00'); echo date('c', $timestamp) 和 $lastmod = date('Y-m-d\TH:i:s'); $tzd = date('Z'); $lastmod .= ($tzd < 0)? "-".gmdate('H:i', -$tzd) : "+".gmdate('H:i', $tzd); echo date('c', $timestamp) 我想要最后修改的 PHP/HTML 文件日期(时间戳);如果是两天前编辑的,则会显示日期等 您可以使用 PHP 中的 filemtime 函数来获取 ISO-8601 格式的文件的最后修改时间: $filename = 'path/to/your/file.php'; // Replace with your file path if (file_exists($filename)) { $lastModified = filemtime($filename); echo date('c', $lastModified); } else { echo "The file does not exist."; }


访问另一个选项卡中的页面时,PHP 是否会重新初始化会话变量?

我正在 PHP 8.0.30 中构建一个简单的网站,用户成功登录后,特定值将添加到 $_SESSION 中,包括上次访问时间,如下所示: 索引.php 我正在 PHP 8.0.30 中构建一个简单的网站,用户成功登录后,特定值将添加到 $_SESSION,包括他们最后一次访问的时间,如下所示: index.php <?php # Code below is simplified to focus on the relevant lines if ($userisauthenticated) { $_SESSION['lastaccess'] = time(); echo "<script>console.log('Code in index.php was run'); </script>"; } ?> 如果用户将来再次加载另一个页面,我会检查上次访问的时间,如果在指定的时间限制内,则加载页面的其余部分或以其他方式将其注销。请参阅下面的示例: 仪表板.php <?php session_start(); echo "<script>console.log('lastaccess: " . $_SESSION['lastaccess'] . "' ); </script>"; # The code afterwards tries to check if the user is still logged in if (array_key_exists('lastaccess', $_SESSION)) { if (time() - $_SESSION["lastaccess"] < 60 * 60 * 48) { # Go ahead and load page } else { # Log user out } } ?> 但是,我遇到了一个奇怪的问题,如果我通过 index.php 登录,然后几分钟后打开一个新选项卡并通过直接输入网址访问 dashboard.php,则 lastaccess 值与 index.php 不同已经设置了。前两行字面上就是我上面的内容,因此前面没有代码来更改 lastaccess 值。 我还在 index.php 中的控制台中插入了一个测试输出,以查看新选项卡是否由于某种原因预加载 index.php,但是当我在新选项卡中加载 dashboard.php 时,该测试输出永远不会打印到控制台选项卡。 这种情况也只发生在我尝试此操作的某些时候(并非总是如此),这让我想知道它是否与我的浏览器有关(我使用的是 Google Chrome)。 PHP 是否有可能在新选项卡中加载页面时重新初始化存储在 $_SESSION 变量中的值?我对 PHP 会话的了解缺少什么以及导致此问题的原因是什么? 原来是Google Chrome 中的预取设置。当我输入 URL 时,第一个建议是主 URL,它指向 index.php。 Google Chrome 正在预取触发脚本的页面(我的错是没有正确设置它)。 当我打开一个新选项卡只是为了输入 URL 时发现了这一点,是否没有转到该页面并关闭了该选项卡,然后返回到我设置的测试页面以查看 lastaccess 值,刷新了一下,发现值已经更新了!


为什么每次我尝试将应用程序从 Anypoint Studio 部署到 CloudHub 时,我的 pom.xml 文件都会更新?

我的 pom.xml 文件中有以下部分用于我正在执行的虚拟项目: org.mule.tools.maven mule-maven-插件 我正在做的一个虚拟项目的 pom.xml 文件中有以下部分: <plugin> <groupId>org.mule.tools.maven</groupId> <artifactId>mule-maven-plugin</artifactId> <version>${mule.maven.plugin.version}</version> <extensions>true</extensions> <configuration> <classifier>mule-application</classifier> </configuration> </plugin> 每当我尝试直接从 Studio 将应用程序部署到 CloudHub 时,上面的部分就会更改为以下部分: <plugin> <groupId>org.mule.tools.maven</groupId> <artifactId>mule-maven-plugin</artifactId> <version>${mule.maven.plugin.version}</version> <extensions>true</extensions> <configuration> <classifier>---- select project type ----</classifier> </configuration> </plugin> 然后部署失败并出现以下错误: Publication status: error [INFO] ------------------------------------------------------------ [INFO] Steps: [INFO] - Description: Publishing asset [INFO] - Status: error [INFO] - Errors: [The asset is invalid, Error while trying to set type: app. Expected type is: rest-api.] [INFO] ......................................... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:33 min [INFO] Finished at: 2024-01-08T14:11:31+05:30 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.mule.tools.maven:exchange-mule-maven-plugin:0.0.17:exchange-deploy (default-exchange-deploy) on project super-biodata-sapi: Exchange publication failed: Publication ended with errors: [The asset is invalid, Error while trying to set type: app. Expected type is: rest-api.] -> [Help 1] 这可能是什么原因? 以下是一些细节: Anypoint Studio版本:7.16.0 Maven版本:3.8.8 Mule 运行时版本:4.4.0 Mule Maven 插件版本:3.8.0/4.0.0(两者都尝试过) Java版本:OpenJDK 11.0.9 我以前使用过 Anypoint Studio 7.15,在那里完全相同的项目没有任何问题。但更新后,我遇到了很多问题。 我还尝试使用“rest-api”而不是“mule-application”。然后,首先在部署开始时,“rest-api”更改为“mule-application”,然后再次更改为“----选择项目类型----”,最后失败。 我怀疑存在混乱。您提到您正在尝试将 Mule 4 应用程序部署到 CloudHub,但对资产的引用和错误消息与将资产发布到 Any point Exchange 相关。 CloudHub是一个部署和执行Mule应用程序的云平台。 Anypoint Exchange 是资产存储库,包括 REST API 的定义,但不包括 Mule 4 应用程序,也不用于执行任何操作。有关有效资产的详细信息,请参阅文档。 由于 mule-application 不是发布到 Exchange 的有效资产类型(对于 Mule 4),那么 Studio 似乎试图让您更改为有效的资产类型。 如果您尝试部署到 CloudHub,请参阅文档了解不同的方法。


Python 3.7 BeautifullSoup soup.find 错误 - find() 不接受关键字参数

我从 URL 获得了以下 HTML: 我从 URL 中获得了以下 HTML: <h4> \r\n \r\n\r\n <a href="/l"> \r\n <!-- mp_trans_rt_start id="1" args="as" 1 -->\r\n <span class="brandWrapTitle">\r\n <span class="productdescriptionbrand">Mxxx</span>\r\n </span>\r\n <span class="nameWrapTitle">\r\n <span class="productdescriptionname">Axxxname</span>\r\n </span>\r\n <!-- mp_trans_rt_end 1 -->\r\n </a> \r\n\r\n </h4> 我正在尝试使用 python 来查找类名: import urllib.request from bs4 import BeautifulSoup url = "https://link" user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36' urlwithagent = urllib.request.Request(url,headers={'User-Agent': user_agent}) response = urllib.request.urlopen(urlwithagent) soup = response.read() product = soup.find("h4", attrs ={"class=": "productdescriptionname"}) print (product) Everythink 完美运行直到上线: product = soup.find("h4", attrs ={"class=": "productdescriptionname"}) 我收到如下错误: find() takes no keyword arguments 我不知道如何解决它 - 有很多信息,但没有任何作用:/ 在使用 BeautifulSoup 之前,您需要将其转换为 find 对象,否则它会使用 str.find 例如: soup = BeautifulSoup(response.read(), "html.parser") product = soup.find("h4", attrs ={"class": "productdescriptionname"}) print (product) 我认为这值得一提,如果 find 方法有问题,检查 type(soup) 是一个很好的方法来查明您是否正在使用正确的 bs4.BeautifulSoup 对象而不是 str。 我想在这里指出一件事,如果使用 soup.prettify() 使 html 可读。需要注意的是,.prettify() 将 bs4.BeautifulSoup 转换为 str。所以这应该单独使用,例如: soup = BeautifulSoup(response) # type(soup) --> bs4.BeautifulSoup print(soup.prettify()) # print readable html 不喜欢: soup = BeautifulSoup(response).prettify() # type(soup) --> str 我在网上读到的关于这个问题的另一件事是这样的:“你的 beautiful soup 版本可能不支持 find。”因此,我最终升级和降级了版本很多次,然后才意识到这是一个错误的陈述由业余爱好者制作。 在打印之前我已经为此奋斗了大约 45 分钟type(soup)。我希望这可以节省其他人的时间。 Может кому подойдет история такая повторял за автором ютуба и переписывал код для парсинга и вышла такая же ошибка как в вопросе искал читал, шерстил инет пока не начал перепроверять свой код в общем мой код с ошибкой: from requests import Session from bs4 import BeautifulSoup as BS from time import sleep headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 YaBrowser/23.11.0.0 Safari/537.36'} work = Session() work.get('https://quotes.toscrape.com/', headers=headers) response = work.get('https://quotes.toscrape.com/login', headers=headers) soup = BS(response.text, 'lxml') token = soup.find('from').find('input').get('') в чем здесь ошибка? вот в этой строке token = soup.find('from').find('input').get('') а именно soup.find('from') я решил скать ошибку методом исключения поэтому довел до такого состояния и понял что в странице нет тэга '来自' а есть тэг '形式' как только поменял на тэг 'form' ошибка с soup.find() - find() ушла может кому поможет


如何在 C++/WinRT (WinUI3) 中将图像从内存读取到 ImageSource?

[1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我应该怎么办?图像格式可以是JPG、BMP或PNG之一。 [1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我该怎么办?图像格式可以是 JPG、BMP 或 PNG 之一。 <Image x:Name="img"/> void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data img().Source(???); // what should I do? } [2] 我尝试了InMemoryRandomAccessStream,但没有成功。 我知道在C#中使用MemoryStream很方便,但是如何在C++中实现它? 另一个问题是这个方法是否也适用于JPG和PNG格式的图像? void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; // How to read data from stream? bmp.SetSource(stream); img().Source(bmp); } [3] 现在功能已经实现了,但是还有两个问题 IAsyncAction MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; winrt::Windows::Storage::Streams::DataWriter dw(st.GetOutputStreamAt(0ULL)); dw.WriteBytes({ buf, size }); // This is very inefficient! co_await dw.StoreAsync(); dw.Close(); bmp.SetSource(stream); img().Source(bmp); stream.Close(); } 首先,我发现DataWriter::WriteBytes()确实是在复制数据。但我认为ImageSource只需要从我的buf中读取即可,不需要在读取之前将整个图像完全复制到流中。也许是类似MemoryView的东西,我这样想是不是错了? 其次,DataWriter和InMemoryRandomAccessStream的Close()应该在哪里调用? BitmapImage需要释放内存吗?这里有一个异步函数,我不知道应该写在哪里 [4] 根据IInspectable,我尝试了SHCreatMemStream并搜索了大量信息以提出另一个解决方案。目前的问题是,与方法[3]同样可行,但仍然会出现内存分配问题。 #include "Shlwapi.h" #include "shcore.h" #pragma comment(lib, "shlwapi.lib") void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; IStream* stream{ SHCreateMemStream(buf, size) }; // Copying takes a lot of time static const GUID guidIRandomAccessStream = { 0x905a0fe1, 0xbc53, 0x11df, { 0x8c, 0x49, 0x00, 0x1e, 0x4f, 0xc6, 0x86, 0xda } }; winrt::Windows::Storage::Streams::IRandomAccessStream pRas{ }; CreateRandomAccessStreamOverStream(stream, BSOS_OPTIONS::BSOS_DEFAULT, guidIRandomAccessStream, (void**)&pRas); bmp.SetSource(stream); img().Source(bmp); } 通过性能测试,发现CreateRandomAccessStreamOverStream的时间是一致的,但是SHCreateMemStream消耗的时间与图像大小成正比。可以得出,SHCreateMemStream中创建流的过程也涉及到内存的复制。 我对Windows编程中的Stream不是特别熟悉。创建流的过程一定会涉及到内存复制吗?从内存加载图像可以避免额外的开销吗?还有没有类似MemoryStreamView的结构来替代吗? 还有一个问题,我知道新的图像肯定需要内存存储。 BitmapImage设置Stream为Source会接管Stream占用的内存吗? Image控件设置BitmapImage作为Source会接管BitmapImage占用的内存吗? 如果是这样的话,我可以接受Stream分配新的内存,否则仍然是一个效率问题。 谢谢!!!!!!! 使用Stream已经彻底解决了这个问题。如前四期所述。 至于附加问题: ★1 使用 CreatStreamOnHGlobal 而不是 SHCreatMemStream。 因为SHCreatMemStream在调用过程中会对传入的内存块参数进行另一次内存复制。 CreatStreamOnHGlobal 创建流后不执行内存复制。您可以先通过GlobalAlloc分配内存,写入所需的图像数据,然后调用CreatStreamOnHGlobal,无需任何时间开销。另外,可以将CreatStreamOnHGlobal的第二个参数设置为true,自动释放GlobalAlloc分配的内存。 通过进程内存监控,我发现对于同一个程序,使用CreatStreamOnHGlobal的速度是SHCreatMemStream的两倍,并且不会导致内存泄漏。 ★2 创建的Stream需要调用Release方法减少一个引用。 IRandomAccessStream作为局部变量,会自动析构,无需主动释放。 并且BitmapImage还管理一部分引用,这些引用在离开作用域后被释放。 通过测试COM对象上Release方法的返回值,发现整个程序结束后引用计数又回到了0


© www.soinside.com 2019 - 2024. All rights reserved.