小编Fra*_*erg的帖子

无效到自己的位图

我想在屏幕外渲染一个控件到一些位图,以便我可以快速访问它.

不幸的是,Control.DrawToBitmap似乎绘制了它所调用的整个控件,包括它的所有子控件.在内部,它向位图发出带有自提供DC的WM_PRINT消息.然后将此临时位图blitting到用户提供的位图.对我来说不可接受,我宁愿根据需要更新这个位图,以便在需要位图时最小化我的性能.

在理想情况下,我希望表单的行为就像它在屏幕上可见(但它不可能).这意味着,如果某个控件的Text属性发生了变化,则表单将部分失效.然后,捕获相关的消息/事件将允许我为要绘制的表单指定我自己的DC,或者简单地将表单DC BitBlt到我自己的DC.

我看过的一些方向:

  • PaintEventArgs参数OnPaint似乎举行成员savedGraphicsState,也许它可以用来找出不需要无效
  • 表单可见但在屏幕区域外.然而,控件不会被绘制.
  • 在窗口上手动调用RedrawWindow(),同样的故事

c# winapi off-screen wm-paint

11
推荐指数
1
解决办法
1066
查看次数

Parallel.For vs常规线程

我试图理解为什么Parallel.For在以下场景中能够胜过许多线程:考虑一批可以并行处理的作业.在处理这些作业时,可能会添加新工作,然后也需要对其进行处理.该Parallel.For解决方案将如下所示:

var jobs = new List<Job> { firstJob };
int startIdx = 0, endIdx = jobs.Count;
while (startIdx < endIdx) {
  Parallel.For(startIdx, endIdx, i => WorkJob(jobs[i]));
  startIdx = endIdx; endIdx = jobs.Count;
}
Run Code Online (Sandbox Code Playgroud)

这意味着Parallel.For需要同步多次.考虑面包优先图算法算法; 同步的数量会非常大.浪费时间,不是吗?

尝试使用老式的线程方法:

var queue = new ConcurrentQueue<Job> { firstJob };
var threads = new List<Thread>();
var waitHandle = new AutoResetEvent(false);
int numBusy = 0;
for (int i = 0; i < maxThreads; i++) 
  threads.Add(new Thread(new ThreadStart(delegate {
    while (!queue.IsEmpty || numBusy > 0) { …
Run Code Online (Sandbox Code Playgroud)

c# performance multithreading

9
推荐指数
1
解决办法
2235
查看次数

如何在合并的自定义android视图上维护布局属性?

我试图用应该做的完全一样的自定义复合视图替换一组视图。具体来说,我经常重复以下布局:

<LinearLayout style="@style/customLayoutStyle">
  <Button style="@style/customButtonStyle" />
  <TextView style="@style/customTextViewStyle" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我的目标是用一个替换该块<Highlighter />

为此,我在res / layout / highlighter.xml中定义了类似的内容

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/customLayoutStyle">
    <Button android:id="@+id/btnHighlighter" style="@style/customButtonStyle" />
    <TextView android:id="@+id/lblHighlighter" style="@style/customTextViewStyle" />    
</merge>
Run Code Online (Sandbox Code Playgroud)

在我的自定义视图中,我有类似

public class Highlighter extends LinearLayout {
    public Highlighter(Context context, AttributeSet attrs) {
        super(context, attrs);
        inflate(context, R.layout.highlighter, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这通常可行,但是似乎<merge>忽略了标签的某些布局参数。此屏幕截图说明了似乎有问题的地方。使用我尝试替换的LinearLayout块的3倍,最下面一行的3张图像已正确对齐。仅左上方的图像使用自定义视图。我的猜测是padding和layout_weight的布局参数丢失了。我是在做错什么,还是需要解决方法?

android android-layout android-xml android-view

7
推荐指数
1
解决办法
3035
查看次数

抽象实现的接口上的C#协方差

使用C#/ .NET 4.0我希望以下方案是可行的:

interface IA<out TB> where TB : IB { }
interface IB { }

class A<TB> : IA<TB> where TB : IB { }
class B : IB { }


abstract class AbstractA<TB> : IA<TB> where TB : IB { }
class DerivedA<TB> : AbstractA<TB> where TB : IB { }

static void Main(string[] args) {
    var myAB = new A<B>();
    Debug.Assert(myAB is IA<B>); // fine
    Debug.Assert(myAB is IA<IB>); // fine

    var myDerivedAB = new DerivedA<B>();
    Debug.Assert(myDerivedAB is …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 derived-class covariance c#-4.0

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