小编Roe*_*eeK的帖子

使用Font时WPF TextBlock内存泄漏

我在Windows 7上使用.NET 4.5,可能会发现内存泄漏.
我有一个TextBlock(不是TextBox- 它不是Undo问题),它每秒都会改变它的值(CPU使用率,时间等等).
使用.NET Memory Profiler(并通过简单地观察任务管理器)我注意到内存不断增长.为了更准确,我看到越来越多的实时实例UnmanagedMemoryStream(我试过GC.Collect()这显然没有做任何事情).

经过一些测试后,我发现只有当我将TextBlock字体设置为资源字体时,才会出现此问题,如下所示:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Control.Foreground" Value="#CCCCCC"/>
    <Setter Property="FontFamily" Value="pack://application:,,,/MyUIControls;component/./Fonts/#Noto Sans"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

我尝试Text直接从代码或通过Binding 更新属性,它的行为方式相同.

底线:
FontFamily设置时,UnmanagedMemoryStream每次我更新文本时都会继续(永远)继续实例.当我没有(设置FontFamily属性)时,内存是稳定的.
(顺便说一句,它发生在我使用Label而不是TextBlock那样)

它看起来像一个内存泄漏,但我找不到任何关于它的参考.
有关如何解决的任何建议?

c# wpf xaml

13
推荐指数
1
解决办法
2049
查看次数

python线程和套接字

我有一个"我只想了解它"的问题..首先,我在Ubuntu上使用python 2.6.5.

因此.. python中的线程(通过线程模块)只是"线程",只是告诉GIL在一段时间内从每个"线程"运行代码块,所以......实际上并没有这里真正的线程..

所以问题是 - 如果我在一个线程中有一个阻塞套接字,现在我发送数据并阻塞线程5秒钟.我希望阻止所有程序,因为它是一个sock.send阻止线程的C命令().但我很惊讶地看到主线程继续运行.所以问题是 - 在达到像send这样的阻塞命令后,GIL如何能够继续并运行其余的代码?是不是必须在这里使用真正的线程?

谢谢.

python python-multithreading

4
推荐指数
3
解决办法
2699
查看次数

获取纯python中的标记位索引

我在这里涉及两个问题:一个是"如何",第二个是"这个伟大的解决方案听起来不错吗?"
事情就是这样:我有一个带有int值的对象,它存储了使用该对象的所有人ID.它是使用标记技术完成的(人员ID是0-10).

我遇到了这种情况,如果这个值只标记了一个id,我想得到这个id.

对于我使用的第一个测试value & (value-1)很好,但至于第二件事,我开始想知道最好的方法是什么(我想知道它的原因是因为这个计算在一个关键时刻发生了至少300次地点).

所以我想到的第一种方式是使用math.log(x,2),但我觉得这个解决方案有点不舒服,因为它涉及一个值的"硬"数学,而不是非常简单的位操作,我觉得我错过了一些东西.

我想到的第二种方法是计算value<<1直到它达到1,但正如你在基准测试中看到的那样,它更糟糕.

我实现的第三种方式是非计算方式,并且是最快的,它使用的字典包含0到10的所有可能值.

就像我之前说的那样:在 Python中有没有"正确"的方式呢?
基于字典的解决方案是一种"合法"的解决方案吗?(可读性/任何-其他-原因-为什么-不收?)

import math
import time

def find_bit_using_loop(num,_):
    c=0
    while num!=1:
        c+=1
        num=num>>1
    return c

def find_bit_using_dict(num,_):
    return options[num]

def get_bit_idx(num, func):
    t=time.time()
    for i in xrange(100000):
        a=func(num,2)
    t=time.time()-t
    #print a
    return t

options={}
for i in xrange(20):
    options[1<<i]=i

num=256
print "time using log:", get_bit_idx(num, math.log)
print "time using loop:", get_bit_idx(num, find_bit_using_loop)
print "time using dict:", get_bit_idx(num, find_bit_using_dict)
Run Code Online (Sandbox Code Playgroud)

输出:

time using log: 0.0450000762939 …
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
294
查看次数

标签 统计

python ×2

c# ×1

python-multithreading ×1

wpf ×1

xaml ×1