我有一个Qt应用程序与这种main()...
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
... A separate, non-GUI thread is launched here
mainWin.Init();
mainWin.show();
app.exec();
}
Run Code Online (Sandbox Code Playgroud)
在mainWin需要知道何时可以开始与mainWin通信之前创建的另一个线程.但由于mainWin使用Qt信号,插槽,定时器等,因此在事件循环运行之前(通过exec()),它还没有真正准备好.
我的问题是:当事件循环开始时是否会发出一些信号或事件?
考虑一下.在mainWin.Init()中,您可以创建类似QTimer的内容,甚至可以调用.start()来启动它.但实际上它不会被运行并在调用exec()之前触发事件.这就是我需要知道事件循环何时真正开始的原因.
我正在制作一个需要一些相当紧凑的时间的应用程序,而秒表类是完美的解决方案.但是,有时候我注意到,当在小型平板电脑上运行时,秒表值已经过时了.我添加了一些调试打印输出,每200毫秒左右监视一次秒表的值:
0:00:197
0:00:502
0:00:702
...
0:03:356
0:12:93
0:13:21
0:13:421
...
它怎么可能从~3秒跳到~13秒?我现在看到底层函数QueryPerformanceCounter()是错误的(小心QueryPerformanceCounter()),但我感觉到其他东西在这里发生了.
任何见解都表示赞赏.
更新:
这里有关于我的代码的更多细节:它非常简单.它是一个WPF应用程序,它Stopwatch在启动时创建一个新对象,然后通过它启动它Start().我然后创建一个DispatcherTimer,像这样:
displayTimer = new DispatcherTimer();
displayTimer.Tick += display_Tick;
displayTimer.Interval = DISPLAY_INTERVAL_TIMESPAN;
Run Code Online (Sandbox Code Playgroud)
时间跨度为200毫秒.我的调试代码只是在Stopwatch每次dispatchTimer滴答时打印出对象的值.
UPDATE2:
一个有趣的Microsoft支持文章是性能计数器值可能意外地向前飞跃.
我正在使用WPF/C#应用程序,我需要锁定用户在一段时间内访问特定功能.基本上,从某个事件发生的那一刻起,我想在接下来的24小时内阻止某些访问.
简单的案例:
都好.但是,用户可以更改系统时间,这对我来说很困难.他们可以提前24小时设置系统时间,我的应用程序将更加明智.
我假设在Windows中更改时间会进入系统的实时时钟......那么是否有任何独立于系统时钟的自由运行计时器?一个用户不能搞砸?
任何见解都表示赞赏.
我一直在追踪我的应用程序中的一些内存泄漏.这是一个真正的痛苦,但我终于收紧了一切.但是,有一点Windows内存管理令我感到困惑.以下是应用程序内存使用情况的打印输出...
Time PrivateMemorySize64 WorkingSet64
20:00:36 47480, 50144
20:01:06 47480, 50144
20:01:36 47480, 50144
20:02:06 47480, 149540
20:02:36 47480, 149540
20:03:06 47480, 149540
Run Code Online (Sandbox Code Playgroud)
工作装置在30秒的时间内从49 MB跳到146.这种情况在一夜之间发生,因为应用程序基本上什
该工作组(这是任务管理器显示我)似乎是能够被其他应用程序,如调试器的影响(因为我学会了在寻找内存泄漏).在阅读了有关工作集的文档后,我仍然没有很好的理解.
任何帮助表示赞赏.
更新:感谢响应者的一些链接以及一些额外的搜索,我更好地了解了一个单独的流程如何导致我的流程的工作集增长.很高兴知道工作集中的峰值并不一定表明你的应用程序正在泄漏...还有理由不依赖任务管理器进行内存评估:)
有用的网址:
我有一个在.NET 3.5上运行的独立WPF应用程序.每隔一段时间,显示屏就会冻结几秒钟.这在经常更新某些内容的屏幕上最为明显.这是一个显示问题的视频.
当显示器冻结时,界面保持响应(视频).
我遇到过一些其他类似问题的帖子,这些帖子将其归因于SW/HW渲染问题.为了安全起见,我完全禁用了硬件渲染,但仍然存在问题.
我在冻结期间运行了一个文件监视器,看看是否有一些特殊的文件访问或活动,但没有什么是不寻常的.
最后说明:目标平台是一款小型触摸屏平板电脑,没有太多内存或马力(512 MB).我只在目标上看到这个问题,而不是在我的开发PC上,它在资源方面有更多.
UPDATE
我以为我通过删除一些动画代码修复了这个问题,但它没有用.我仍然遇到这个问题而且我已经到了最后.
这是我尝试过的更多内容:
我真的很难过,并且增加了赏金.正如我所提到的,问题只发生在目标PC(链接)上.
我有一个应用程序在自助服务终端(C#/ WPF)中的独立面板PC上运行.它对文本文件执行一些典型的日志记录操作.PC具有一些有限的磁盘空间来存储这些日志.
我需要做的是能够指定允许日志文件的最大大小.如果在尝试写入日志时超出最大大小,则会将新数据写入日志末尾,并从头开始清除最旧的数据.
获取文件大小没有问题,但有没有任何典型的文件操作技术来保持文件在一定的大小?
我有一个在XAML中定义的动画(作为UserControl),它实际上每秒在两个图像之间切换:
<UserControl x:Class="KaleidoscopeApplication.Controls.RemoteAnimation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="RemoteAnimation_Loaded"
Unloaded="RemoteAnimation_Unloaded">
<Grid Canvas.Left="500" Canvas.Top="84">
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard x:Name="storyboard" RepeatBehavior="Forever">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="remote2" BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Visibility)">
<DiscreteObjectKeyFrame KeyTime="0:0:1">
<DiscreteObjectKeyFrame.Value>
<Visibility>Collapsed</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
<DiscreteObjectKeyFrame KeyTime="0:0:2">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Image Name="remote1" Source="/Resources/Elements/Images/341.png"/>
<Image Name="remote2" Source="/Resources/Elements/Images/342.png"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
它可以在窗口中使用:
<!-- Remote -->
<uControl:RemoteAnimation
x:Name="remoteAnimation"
Canvas.Left="316" Canvas.Top="156" Height="246" Width="121" />
Run Code Online (Sandbox Code Playgroud)
我的问题是,当包含动画的窗口关闭时,它会继续运行并导致泄漏.我无法通过带有storyboard.Stop()的RemoteAnimation_Unloaded()来停止动画......它不会做插孔.
我已经检查了这两个帖子,但它们不适用:
我能够进入卸载方法,但调用Stop()不会停止动画.根据我的理解,对于故事板调用Begin()可能是一个问题.isControlable参数存在重载.但是,由于动画完全在XAML中,我不确定如何影响它.
我创建了一个自定义进度条,如下所示:
<!-- Custom progress bar -->
<Style
x:Key="CopyProgressBar"
TargetType="ProgressBar">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="ProgressBar">
<Grid>
<Border
x:Name="PART_Track"
CornerRadius="5"
BorderBrush="#BBC6C4"
BorderThickness="2" />
<Rectangle
x:Name="PART_Indicator"
Fill="#A5B2B0"
RadiusX="5"
RadiusY="5"
Margin="3"
HorizontalAlignment="Left" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
以下是它的使用方法:
<ProgressBar
x:Name="copyProgress"
Height="13"
Width="279"
Canvas.Left="158"
Canvas.Top="103"
Minimum="0"
Maximum="100"
Style="{StaticResource CopyProgressBar}" />
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是当进度充满时,填充条的右侧会被剪裁,从而消除了我想要的圆形样式.我已经摆弄了填充,边距,最大宽度等,但我找不到防止剪裁的方法.
这是一张图片:

我在C#/ WPF应用程序中遇到了一些OutOfMemoryExceptions,并且在尝试分析内存使用情况时遇到了一些令人困惑的数据.
当应用程序通常运行时,Windows任务管理器将内存使用量显示为大约34 MB(在创建对象和收集垃圾时略微反弹).当我运行内存分析应用程序(如CLR Profiler和dotTrace Memory)时,它们显示总内存使用量大约为1.2 MB.
为什么这个巨大的差异?任务管理器看到这些分析器没有看到什么?
更新:我在我的应用程序中添加了一些诊断代码,以便经常通过Process类打印出各种内存信息.
在运行我的应用程序时,我在DebugDiag中设置了一个规则,以便在发生异常时执行内存转储.我强制异常并发生内存转储.此时,我的应用程序的内存使用量(由任务管理器显示)从32 MB跳到145 MB并保持不变.
您可以在下表中看到此跳转(WorkingSet64).我仍然试图理解Process类提供的所有类型的内存信息.外部应用程序如何使我的应用程序的工作集像这样增长?
我正在尝试将 DSACryptoServiceProvider 类与 C# 一起使用来创建两个 DLL:一个能够验证和创建数字签名,另一个只能进行验证。基本上,我正在尝试创建一个私钥/公钥对并相应地保存它们的密钥(到文件)。
我在使用 ExportParameters() 时遇到了问题。当我尝试导出包含私有信息的密钥(使用序列化)时,私有信息会自动清除。
有没有更好的方法来存储密钥?
提前致谢。
wpf ×4
.net ×2
c# ×2
memory ×2
windows ×2
animation ×1
datetime ×1
encryption ×1
event-loop ×1
events ×1
file ×1
filesize ×1
freeze ×1
logging ×1
profiler ×1
progress-bar ×1
qt ×1
rendering ×1
stopwatch ×1
storyboard ×1
styles ×1
systemtime ×1
timestamp ×1
xaml ×1