我经常使用 Visual Studio 2008、.NET C# 2.0-3.5 和 Windows 窗体,并且和我之前的许多人一样,我注意到 GDI+ 在绘制控件时非常慢。请注意,我不太处理图像(JPG、GIF 等)。图像仅作为某些地方的图标。这实际上是绘制缓慢的控件/表单/等。
问题是您可以看到正在绘制控件,并且可能需要几秒钟才能绘制一组看似简单的控件。即,它的滞后和可怕。
我已经做了一些测试,我只是在表单上放置了一些标签(40-50),按 F5 运行并且必须等待它们被绘制。再次,滞后而不是一个很好的体验。
所以,WPF 可能会解决这个问题,但我/我们还没有准备好转向 WPF。所以我在四处寻找解决方法或修复程序,我偶然发现了 Direct2D,在阅读其他一些库时。
让我有点困惑,因此这些问题:
1) 首先,我想要的是一种相当简洁和简单的方法,可以用更快的硬件加速方法替换GDI+。是否可以在不转到 WPF 并且不必重写我所有的 Windows 窗体代码的情况下做到这一点?
每当我在 Direct2D 上阅读任何内容时,我都会看到很长的通常可怕的 C++ 代码块,告诉我如何手动编写用于绘图的代码。我不要那个。
2) 在网上阅读时,我偶然发现了 SlimDX,但我不知道如何使用它(我承认,我在写作时还没有尝试过很多)。假设我已经有了一个 GUI 应用程序(Windows 窗体,标准 C# 代码)——我能不能以某种方式使用 SlimDX(或类似的东西)来“替换”GDI+ 而不需要太多重写?
我的问题是我找不到任何示例或类似的例子来告诉我是否可以在我已经创建的 Windows 窗体软件中使用 SlimDX、Direct2D 或其他类似的东西,如果可能的话 - 怎么做。
希望我不要太模糊 =)
==编辑== 2010-09-22
我已经在我的真实应用程序中进行了一些测试,并将缓慢的事情之一与此隔离开来:
当我向 UserControl 中的某些标签添加文本时,控件会调整自身大小以适应文本。例如,包含的 GroupControl 会根据刚刚添加到标签的 .Text-property 的文本大小进行一些调整。
大约有 10 个标签控件。第一次更新标签,从而改变大小,整个过程大约需要 500 毫秒。第二次更新标签,大小没有变化,大约需要 0 毫秒。
==编辑 2== 2010-09-22 …
我有一个Backgroundworker,其目的是在后台顺序运行作业.现在,一项工作以多线程方式实现.这意味着,Backgroundworker将创建多个线程.我使用任务并行库,所以我使用Task.Factory.StartNew创建多个任务.
任务运行后,Backgroundworker等待所有任务完成.
现在我打印Backgroundworker的ManagedThreadID和所有任务'ManagedThreadIDs.我发现BackgroundWorker的ManagedThreadID始终与第一个任务的ManagedThreadID相同.我认为这不应该发生,所以我无法解释.我认为Backgroundworker的线程必须与它创建的所有任务不同,因此ManagedThreadID必须彼此不同.
谁能解释为什么会出现这种情况?非常感谢你.
编辑:
代码类似于:
Backgroundworker.Run(){
// Print Thread.CurrentThread.ManagedThreadID.
var task = Task.Factory.StartNew(action1); // action1, action2 also print ManagedThredID.
taskList.Add(task);
task = Task.Factory.StartNew(action2);
taskList.Add(task);
... // Several other tasks.
foreach(var task in taskList) task.Wait();
}
Run Code Online (Sandbox Code Playgroud)
您会发现一个任务与Backgroundworker具有相同的ManagedThreadID.
假设我有一个包含以下jpeg文件的文件夹:
adfjhu.jpg Afgjo.jpg
Bdfji.jpg bkdfjhru.jpg
Cdfgj.jpg cfgir.jpg
Ddfgjr.jpg dfgjrr.jpg
Run Code Online (Sandbox Code Playgroud)
如何删除或列出以大写字母开头的文件?
这可以用组合来解决find,grep并xargs.
但是在bash中可以使用普通的文件循环/模式匹配吗?
下面的cmd不起作用,因为(据我所知)LANG设置为en_US
和整理顺序.
$ ls [A-Z]*.jpg
Afgjo.jpg Bdfji.jpg bkdfjhru.jpg Cdfgj.jpg cfgir.jpg Ddfgjr.jpg dfgjrr.jpg
Run Code Online (Sandbox Code Playgroud)
这种作品
$ ls +(A|B|C|D)*.jpg
Afgjo.jpg Bdfji.jpg Cdfgj.jpg Ddfgjr.jpg
Run Code Online (Sandbox Code Playgroud)
但我不想为所有字符AZ做这个通用解决方案!
这可能吗?
欢呼// Fredrik
-- Given a CSV string like this:
declare @roles varchar(800)
select @roles = 'Pub,RegUser,ServiceAdmin'
-- Question: How to get roles into a table view like this:
select 'Pub'
union
select 'RegUser'
union
select 'ServiceAdmin'
Run Code Online (Sandbox Code Playgroud)
发布后,我开始玩一些动态SQL.这似乎有效,但似乎使用动态SQL可能存在一些安全风险 - 对此有何看法?
declare @rolesSql varchar(800)
select @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + ''''
exec(@rolesSql)
Run Code Online (Sandbox Code Playgroud) 情况:共享单个后端服务器(WCF RIA或其他Web服务)的多个前端(例如Silverlight,ASP).
我正在寻找一个标准,以防止多人编辑同一个表格.我知道这不是一个容易的主题,但要求是要求.
以前我使用DB上次修改日期来对提交的数据进行处理,如果数据在加载后被修改,则会发出警告或错误.初始系统只是在没有任何警告的情况下覆盖数据.问题是我有一个新的要求来防止这两种情况.会有很多UI,因此锁定系统可能是一个挑战,并且显然无法保证客户端不会在编辑过程中关闭窗口/浏览器.
我将不胜感激任何帮助.
只是开始制作一个Web应用程序,并想知道哪个更好,或者至少它们之间的主要区别是什么(因为它可能对我使用它们很重要)?
我正在编写一个算法来生成这种数组的所有可能的排列:
n =长度
k =数组中1的数量
所以这意味着如果我们有k 1,我们将在数组中得到nk 0.
例如:n = 5; k = 3;
所以很明显这个数组有5种可能的排列,因为
n!/(k!(nk)!
5!/(3!2!)=(5*4)/ 2 = 10个
可能的数组值
以下是所有值:
11100
11010
11001
10110
10101
10011
01110
01101
01011
00111
我猜我应该使用递归算法,但我只是没有看到它.我正在用C++编写这个算法.
任何帮助,将不胜感激!
我正在尝试创建单个查询以从主表(WordPress用户表)和用户元表中获取信息.
如果您不熟悉WP DB体系结构:wp_users保存基本用户信息及其ID,wp_usermeta包含ID,meta_key和meta_value.
假设我希望获得具有某些meta_keys和meta_values的所有用户.这是我目前的查询(基于可用的meta_keys通过PHP生成):
SELECT ID,
user_email,
user_login,
first_name.meta_value as first_name,
last_name.meta_value as last_name,
phone_number.meta_value as phone_number,
wp_capabilities.meta_value as wp_capabilities
FROM wp_users,
(select * from wp_usermeta where meta_key = 'first_name') as first_name,
(select * from wp_usermeta where meta_key = 'last_name') as last_name,
(select * from wp_usermeta where meta_key = 'phone_number') as phone_number,
(select * from wp_usermeta where meta_key = 'wp_capabilities') as wp_capabilities
WHERE
ID = first_name.user_id AND
ID = last_name.user_id AND
ID = phone_number.user_id AND
ID = wp_capabilities.user_id AND
wp_wpi_capabilities.meta_value …Run Code Online (Sandbox Code Playgroud) 是否有一些现成的插件可以提醒管理员有关memcached实例无法从Django应用程序访问的内容?我不是指监视memcached守护进程本身,而是检查我的Django应用程序是否从缓存中获益.
我的基本想法是检查cache.set后面的cache.get是否实际返回了一些东西,如果没有 - 然后发送电子邮件给管理员,但每小时只发送一封,以免淹没收件箱.
但也许有更先进的东西?
我正在制作一个日历应用程序供我自己使用和学习.
到目前为止,我已经毫无困难地使用多种形式,并在彼此之上打开新的等等.
这是一个例子:
private void button1_Click(object sender, EventArgs e)
{
if (ceForm != null) ceForm.Close();
ceForm = new CalendarEventForm();
ceForm.Show();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我现在开始添加计时器,以便在我日历上的重要事件发生之前弹出一个"提醒"表单(即1小时前等).
代码在加载程序时设置定时器,然后当每个定时器过去时,这称为:
static void lazyTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
mainForm.ShowReminder((sender as LazyTimer).ReferredEvent);
}
Run Code Online (Sandbox Code Playgroud)
LazyTimer与System.Timers.Timer完全相同,除了添加的属性"ReferredEvent",它引用了要提醒的日历事件.
MainForm.ShowReminder()如下:
public void ShowReminder(LazyEvent lazyEvent)
{
ReminderForm newReminder = new ReminderForm();
newReminder.LoadEvent(lazyEvent);
newReminder.Show();
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是ReminderForm崩溃了.我已经尝试过其他形式(例如CalendarEventForm,我知道它可以正常工作)并且它们也崩溃了.但是,当我尝试通过按下主窗体上的按钮加载ReminderForm时,它工作正常.
为什么我的表单在被计时器加载(间接)时会崩溃?