我想要做的是导致一个控件(在同一个过程中,但我无法控制)重绘自己,并让我的代码阻塞,直到它完成重绘.
我尝试过使用,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) 我得到一个堆栈空异常.如果堆栈不为空(它有16个项目),那怎么可能?
我得到了错误的快照:

有人可以解释一下吗?
我的困境是如何最好地处理可以接受参数的长重循环.请考虑以下方法:
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) 考虑以下算术计算.为简单起见,我尽可能地缩短了它们:
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的规则,如果我想要执行计算,正如我没有括号那么正确吗?
我当然知道我不能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) 我偶然发现了一个不寻常的问题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)导致错误(不是代码异常,只是操作系统说它无法找到文件).我该如何调试这里发生的事情?
按照David的建议,我使用procmon.exe观察了这个过程.
结果如下:http://i.imgur.com/IBz6Ujt.png
您会注意到有很多事情在重复进行,我并不完全理解,最后报告文件已成功写入.
感谢Patrick的建议,我发现由于我没有考虑到代码路径,该文件立即被删除在不同的代码段中.很抱歉浪费每个人的时间.我感到宽慰,虽然这只是我没有思想,而不是不可预见的网络问题.
我试图确定是否有更好的方法来执行以下查询:
我有一个List的Pair对象.
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)
有没有更好的办法?如果没有,你更喜欢哪一个?
在浏览开源代码(来自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的另一个问题我得出的结论是,这实际上是否需要完成或由编译器自动完成的答案可能是编译器/设置依赖的.
我的问题是,如果_foo是static集体成员会有什么不同吗?在手动优化中是否还有一点,或者访问静态类成员不比访问本地变量更"昂贵"?
PS - 我是出于好奇而不是解决具体问题.
我有以下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#中实现这一点.
我在c#中尝试了进程类,但我只能得到进程的窗口名称.
谢谢