搜索
bottom↓
回复: 18

VisualStudio下,运行C#程序完全正常,生成exe后很卡

[复制链接]

出0入9汤圆

发表于 2024-11-19 13:23:25 | 显示全部楼层 |阅读模式
用C# WPF写的界面,在Visual Studio中点运行,非常流畅正常

使用生成的exe文件运行,就变得奇卡无比,

这个大概会是什么原因?

阿莫论坛21周年了!感谢大家的支持与爱护!!

当你觉得为时已晚的时候,恰恰是最早的时候。

出0入0汤圆

发表于 2024-11-19 17:10:12 | 显示全部楼层
什么操作变卡的,不会一打开软件就变卡三

观察一下内存啥的,看看内存有没有一直涨,一直涨就是内存管理有问题

看看是不是都在UI线程里干活

加一个调试接口,输出日志,看看都是哪些地方卡

大概就这些思路了

出0入16汤圆

发表于 2024-11-19 17:28:04 | 显示全部楼层
十有八九都在UI里干活卡死

出300入2558汤圆

发表于 2024-11-19 18:44:49 来自手机 | 显示全部楼层
都有源码了,procexp 跟踪下啊

出0入9汤圆

 楼主| 发表于 2024-11-19 19:44:03 | 显示全部楼层
stpw.Start();
System.Threading.Thread.Sleep(1);
stpw.Stop();

TextBox_Test.Text = stpw.ElapsedMilliseconds.ToString();

添加这段测量时间,发现在debug环境下,运行时间正确,等于1,
直接运行exe,等于15

也就是足足慢了15倍。

出0入42汤圆

发表于 2024-11-19 22:16:14 来自手机 | 显示全部楼层
将所有代码注释掉,打包成exe再试试,不卡就开几条,再不卡就再开几条,逐步试。

出0入9汤圆

 楼主| 发表于 2024-11-19 23:13:21 | 显示全部楼层
t3486784401 发表于 2024-11-19 18:44
都有源码了,procexp 跟踪下啊
(引用自4楼)

sleep 函数, 在debug模式下,完全准确。

脱离debug,用exe单独运行,就变得很慢很慢。

出300入2558汤圆

发表于 2024-11-20 02:11:38 | 显示全部楼层
我在 VC 下也调用 Sleep( ) 函数啊,注意大小写有区别。
无论 debug 还是 release 都差不多,也是用 Sleep(1) 来避免某个线程卡死 CPU 的。

不过都是后台线程才用到 Sleep,前台有界面的线程用 Timer 来搞。

出0入9汤圆

 楼主| 发表于 2024-11-20 12:27:38 | 显示全部楼层
t3486784401 发表于 2024-11-20 02:11
我在 VC 下也调用 Sleep( ) 函数啊,注意大小写有区别。
无论 debug 还是 release 都差不多,也是用 Sleep( ...
(引用自8楼)

我这里是
在BackgroundWork的后台里面,对bin文件进行发送,
发送完一帧,就Sleep 1ms,

在debug下,大概30秒就发送完了。

在release下,却要2-3分钟。

去掉Sleep函数,就很快了。

出0入89汤圆

发表于 2024-11-20 12:35:13 | 显示全部楼层
86180A 发表于 2024-11-20 12:27
我这里是
在BackgroundWork的后台里面,对bin文件进行发送,
发送完一帧,就Sleep 1ms,
(引用自9楼)

这个是sleep精度的问题,我记得这个函数的精度是没法保证到1ms的,你可以参考这个看看  https://blog.csdn.net/i78i845/article/details/129301396

出0入233汤圆

发表于 2024-11-20 14:18:38 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入9汤圆

 楼主| 发表于 2024-11-20 21:57:26 | 显示全部楼层
youkebing 发表于 2024-11-20 12:35
这个是sleep精度的问题,我记得这个函数的精度是没法保证到1ms的,你可以参考这个看看  https://blog.csd ...
(引用自10楼)

ok 谢谢

  1. [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
  2. public static extern uint MM_BeginPeriod(uint uMilliseconds);

  3. [DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
  4. public static extern uint MM_EndPeriod(uint uMilliseconds);

  5. MM_BeginPeriod(1);
  6. Thread.Sleep(1);
  7. MM_EndPeriod(1);
复制代码


按这个操作,问题解决了。

出0入9汤圆

 楼主| 发表于 2024-11-20 21:58:14 | 显示全部楼层

好的 谢谢,
跟楼上给的方案基本一致。

出0入233汤圆

发表于 2024-11-20 22:07:35 | 显示全部楼层
本帖最后由 yyts 于 2024-11-20 22:08 编辑
86180A 发表于 2024-11-20 21:58
好的 谢谢,
跟楼上给的方案基本一致。
(引用自13楼)


这年头得跟上潮流才行,5秒就能解决的事情。

我现在很多代码,都让它帮我写了。

出0入16汤圆

发表于 2024-11-21 09:31:58 | 显示全部楼层
sleep这种操作就不能在UI线程里干,不卡你卡谁,有延时的都得建后台线程,像你这种1ms刷新UI界面有什么意义,根本观察不到

出0入9汤圆

 楼主| 发表于 2024-11-21 20:43:37 | 显示全部楼层
初音之恋 发表于 2024-11-21 09:31
sleep这种操作就不能在UI线程里干,不卡你卡谁,有延时的都得建后台线程,像你这种1ms刷新UI界面有什么意义 ...
(引用自15楼)

麻烦看清楚帖子内容再回复。

我在9楼已经说明了,不是UI里面干活。


我这里是
在BackgroundWork的后台里面,对bin文件进行发送,
发送完一帧,就Sleep 1ms,

在debug下,大概30秒就发送完了。

在release下,却要2-3分钟。

去掉Sleep函数,就很快了。

出0入0汤圆

发表于 2024-11-21 23:59:44 来自手机 | 显示全部楼层
TextBox_Test.Text = stpw.ElapsedMilliseconds.ToString();
修改ui 不能这么快,会反应不过来的
另外不能跨线程改UI

出0入9汤圆

 楼主| 发表于 2024-11-22 00:48:33 | 显示全部楼层
zyqcome 发表于 2024-11-21 23:59
TextBox_Test.Text = stpw.ElapsedMilliseconds.ToString();
修改ui 不能这么快,会反应不过来的
另外不能 ...
(引用自17楼)

这是stopwatch,秒表,只执行一次,测量Sleep(1)的时间。

这个是单独写来测试的,不在后台里面,在UI里面,所以可以用来更新UI。

我就是怀疑是这个函数不准确,所以才去测它的。

出300入2558汤圆

发表于 2024-11-22 02:09:36 | 显示全部楼层
86180A 发表于 2024-11-22 00:48
这是stopwatch,秒表,只执行一次,测量Sleep(1)的时间。

这个是单独写来测试的,不在后台里面,在UI里 ...
(引用自18楼)


上这个 ::QueryPerformanceCounter / ::QueryPerformanceFrequency

标准 WinNT 库,简单粗暴有 us 疗效
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2025-7-16 00:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表