小编Rot*_*tem的帖子

同步重绘窗口控件(使用阻塞方法)

我想要做的是导致一个控件(在同一个过程中,但我无法控制)重绘自己,并让我的代码阻塞,直到它完成重绘.

我尝试过使用,UpdateWindow但似乎并不等待重绘完成.

我需要等待它完成重绘的原因是我想在之后抓住屏幕.

该控件不是dotNet控件,它是常规的Windows控件.

我已经确认:

  • 手柄是正确的.
  • UpdateWindow 返回true.
  • 尝试InvalidateRect(hWnd, IntPtr.Zero, true)在呼叫之前发送UpdateWindow以确保窗口需要无效.
  • 尝试在控件的父窗口上执行相同的操作.

使用的代码:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, bool bErase);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UpdateWindow(IntPtr hWnd);

public bool PaintWindow(IntPtr hWnd)
{
    InvalidateRect(hWnd, IntPtr.Zero, true);
    return UpdateWindow(hWnd);
}
//returns true
Run Code Online (Sandbox Code Playgroud)

c# winapi gdi redraw invalidation

6
推荐指数
1
解决办法
2924
查看次数

堆栈空例外

我得到一个堆栈空异常.如果堆栈不为空(它有16个项目),那怎么可能?

我得到了错误的快照:

堆栈空例外

有人可以解释一下吗?

c# stack multithreading fifo visual-studio-2012

6
推荐指数
2
解决办法
1万
查看次数

优化循环与代码复制

我的困境是如何最好地处理可以接受参数的长重循环.请考虑以下方法:

void HeavyLoop(byte* startingAddress, bool secondaryModification)
{
    for (int i = 0; i < 10000000; i++)
    {
        byte* b = startingAddress + i;
        *b+= 1;
        if (secondaryModification) *b+= 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法会做我想要的,但是我if在循环中使用了10000000个不必要的s.

我是否写过这样的方法:

void HeavyLoop(byte* startingAddress, bool secondaryModification)
{
    if (secondaryModification)
    {
        for (int i = 0; i < 10000000; i++)
        {
            byte* b = startingAddress + i;
            *b+= 1;
            *b+= 2;
        }
    }
    else
    {
        for (int i = 0; i < 10000000; i++)
        {
            byte* b …
Run Code Online (Sandbox Code Playgroud)

c++ optimization loops

5
推荐指数
3
解决办法
1072
查看次数

StyleCop - 运营商优先级的CSharp.Maintainability警告

考虑以下算术计算.为简单起见,我尽可能地缩短了它们:

x = y + y * z;

x = y + z - y * z;
Run Code Online (Sandbox Code Playgroud)

没有StyleCop,这是完全合法的,并且可能,计算遵循BODMAS(与任何算术计算一样).

当它通过StyleCop传递时,它会显示以下警告:

CSharp.Maintainability:在算术表达式中插入括号以声明运算符优先级.

据推测,我需要做的就是在插入括号时遵循BODMAS的规则,如下所示:

x = y + (y * z);

x = (y + z) - (y * z);
Run Code Online (Sandbox Code Playgroud)

正如我假设StyleCop希望我明确定义BODMAS的规则,如果我想要执行计算,正如我没有括号那么正确吗?

.net c# math brackets stylecop

5
推荐指数
1
解决办法
2384
查看次数

多线程系统.Windows.Graphics

我当然知道我不能Graphics从不同的线程绘制到同一个对象,但是我不能绘制到不同线程中的不同 Graphics对象也是真的吗?

考虑以下控制台程序:

class Program
{
    static ThreadDrawer[] drawers;
    static void Main(string[] args)
    {
        int numThreads = 8;
        drawers = new ThreadDrawer[numThreads];
        for (int i = 0; i < numThreads; i++)
        {
            drawers[i] = new ThreadDrawer();
            drawers[i].Start();
        }
        for (int i = 0; i < numThreads; i++)
        {
            drawers[i].Wait();
        }
        Console.WriteLine("Complete.");
        Console.ReadKey();
    }

    class ThreadDrawer
    {
        private Thread thread;
        private AutoResetEvent resetEvent;

        public ThreadDrawer()
        {
            thread = new Thread(DrawRandomCircles);
            resetEvent = new AutoResetEvent(false);
        }

        public void …
Run Code Online (Sandbox Code Playgroud)

c# graphics multithreading gdi+ winforms

5
推荐指数
1
解决办法
1772
查看次数

File.WriteAllLines无声失败

我偶然发现了一个不寻常的问题File.WriteAllLines.

我的代码看起来像这样

File.WriteAllLines(filename, data);
bool exists = File.Exists(filename);
Run Code Online (Sandbox Code Playgroud)

问题是,有时文件写入失败,但不会引发异常,并且代码认为文件存在时不存在.

  • 该文件位于网络位置.
  • 文件名是Database.lock.lock扩展是否对操作系统有意义?
  • Exists返回true,但文件根本就不存在.没有例外.
  • Exists从单独的进程调用返回false.
  • 调用Process.Start(filename)导致错误(不是代码异常,只是操作系统说它无法找到文件).
  • 本地计算机正在运行Windows 7.
  • 远程计算机正在运行Windows XP.

我该如何调试这里发生的事情?

更新

按照David的建议,我使用procmon.exe观察了这个过程.

结果如下:http://i.imgur.com/IBz6Ujt.png

您会注意到有很多事情在重复进行,我并不完全理解,最后报告文件已成功写入.

解决了

感谢Patrick的建议,我发现由于我没有考虑到代码路径,该文件立即被删除在不同的代码段中.很抱歉浪费每个人的时间.我感到宽慰,虽然这只是我没有思想,而不是不可预见的网络问题.

c# file-io file

5
推荐指数
1
解决办法
1486
查看次数

LINQ.SelectMany的替代品,具有恒定数量的内部元素

我试图确定是否有更好的方法来执行以下查询:

我有一个ListPair对象.

A Pair定义为

public class Pair
{
    public int IDA;
    public int IDB;
    public double Stability;
}
Run Code Online (Sandbox Code Playgroud)

我想提取一个包含在中的所有不同ID(int)的列表List<Pair>.

我目前正在使用

var pIndices = pairs.SelectMany(p => new List<int>() { p.IDA, p.IDB }).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

哪个有效,但对我来说似乎不直观,new List<int>只能让它变得扁平化SelectMany.

这是另一种我认为至少可以说不优雅的选择:

var pIndices = pairs.Select(p => p.IDA).ToList();
pIndices.AddRange(pairs.Select((p => p.IDB).ToList());
pIndices = pIndices.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?如果没有,你更喜欢哪一个?

c# linq

4
推荐指数
1
解决办法
954
查看次数

将静态类成员复制到本地变量以进行优化

在浏览开源代码(来自OpenCV)时,我在方法中遇到了以下类型的代码:

// copy class member to local variable for optimization
int foo = _foo; //where _foo is a class member

for (...) //a heavy loop that makes use of foo
Run Code Online (Sandbox Code Playgroud)

从SO的另一个问题我得出的结论是,这实际上是否需要完成或由编译器自动完成的答案可能是编译器/设置依赖的.

我的问题是,如果_foostatic集体成员会有什么不同吗?在手动优化中是否还有一点,或者访问静态类成员不比访问本地变量更"昂贵"?

PS - 我是出于好奇而不是解决具体问题.

c++ optimization

4
推荐指数
1
解决办法
684
查看次数

modf的SSE版本

我有以下modf使用 SSE 内在函数的工作实现,但是__m128i当我需要结果作为__m128.

__m128 integer = _mm_cvtepi32_ps(_mm_cvttps_epi32(value));
__m128 fraction = _mm_sub_ps(value, integer);
Run Code Online (Sandbox Code Playgroud)

是否存在无需类型转换的截断指令,或某种幻数黑客?

c++ sse simd visual-c++

4
推荐指数
1
解决办法
1184
查看次数

如何从c#获取进程窗口类名?

如何获取某个进程的窗口类名?我想在c#中实现这一点.

我在c#中尝试了进程类,但我只能得到进程的窗口名称.

谢谢

c# process

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