如果我有一个整数i,i += 1在多个线程上做是不安全的:
>>> i = 0
>>> def increment_i():
... global i
... for j in range(1000): i += 1
...
>>> threads = [threading.Thread(target=increment_i) for j in range(10)]
>>> for thread in threads: thread.start()
...
>>> for thread in threads: thread.join()
...
>>> i
4858 # Not 10000
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个列表l,l += [1]在多个线程上做似乎是安全的:
>>> l = []
>>> def extend_l():
... global l
... for j in range(1000): l += [1]
... …Run Code Online (Sandbox Code Playgroud) 我目前在WPF用户控件(我的XAML文件的根元素是"UserControl")中工作,我知道它是在Window中托管的.如何使用数据绑定访问Window的属性?
有谁知道为什么简单
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." />
Run Code Online (Sandbox Code Playgroud)
不起作用?我得到的错误信息是:
System.Windows.Data警告:4:无法找到绑定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Window',AncestorLevel ='1''.
编辑:我最终使用了ArsenMkrt方法的变体,因此接受了他的回答.但是,我仍然有兴趣找出为什么FindAncestor不"正常工作".
我有一个图像,比如尺寸为320 x 240像素,我希望在网页上显示两倍大小(即640 x 480像素).在过去,我已经通过设置这样做width=640的img标记.
但是,我刚刚在HTML规范中发现了以下内容:
尺寸属性不用于拉伸图像.
在这种情况下,如何在不违背规范意图的情况下将网页上的图像大小加倍?
这是这个问题的后续行动.我正在编写一个简单的游戏,我正在寻找在Win32窗口中(反复)显示RGB数据数组的最快方法,没有闪烁或其他工件.
在上一个问题的答案中建议采用几种不同的方法,但没有达成共识,哪种方法最快.所以,我把测试程序汇总在一起.代码只是在屏幕上反复显示帧缓冲,尽可能快.
这些是我获得的结果,对于在32位视频模式下运行的32位数据 - 他们可能会让一些人感到惊讶:
- Direct3D (1): 500 fps
- Direct3D (2): 650 fps
- DirectDraw (3): 1100 fps
- DirectDraw (4): 800 fps
- GDI (SetDIBitsToDevice): 2000 fps
Run Code Online (Sandbox Code Playgroud)
鉴于这些数字:
以下是每个Direct*代码路径调用的简短摘要.如果有人知道使用DirectDraw/Direct3D的更有效方法,请发表评论.
1. CreateTexture(D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); DrawPrimitive()
2. CreateTexture(0, D3DPOOL_SYSTEMMEM); CreateTexture(0, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); UpdateTexture(); DrawPrimitive()
3. CreateSurface(); SetSurfaceDesc(lpSurface = &frameBuffer[0]);
memcpy(); primarySurface->Blt();
4. CreateSurface();
Lock(); memcpy(); Unlock(); primarySurface->Blt();
Run Code Online (Sandbox Code Playgroud) 对于在Lua协程的支持是由提供的功能在coroutine表,主要是create,resume和yield.开发人员将这些协同程序描述为堆栈,一流和非对称.
协程也可在Python,或者使用增强发电机(和yield from)或在3.5版本中增加,async和await.
Python中的协程如何与Lua中的协程相比?它们是堆叠的,一流的还是不对称的?
为什么Python的需要如此多的结构(async def,async with,async for,异步内涵,...)的协同程序,而Lua中能为他们提供只有三个内建的功能呢?
在C代码中,我有一个数组和一个从零开始的索引,用于在其中查找,例如:
char * names[] = {"Apple", "Banana", "Carrot"};
char * name = names[index];
Run Code Online (Sandbox Code Playgroud)
从嵌入式Lua脚本,我可以index通过一个getIndex()函数访问,并希望复制数组查找.鉴于Lua的基于单一的阵列,是否有一个同意"最佳"的方法来做到这一点?
例如,我可以使用与我的C数组相同的内容创建一个Lua数组,但这需要在索引时添加1:
names = {"Apple", "Banana", "Carrot"}
name = names[getIndex() + 1]
Run Code Online (Sandbox Code Playgroud)
或者,我可以避免使用更复杂的表添加1,但这会破坏以下内容#names:
names = {[0] = "Apple", "Banana", "Carrot"}
name = names[getIndex()]
Run Code Online (Sandbox Code Playgroud)
建议采用什么方法?
编辑:感谢您的答案到目前为止.不幸的是,在getIndex函数中向索引添加1的解决方案并不总是适用.这是因为在某些情况下索引是"众所周知的" - 也就是说,可以记录索引0表示"Apple"等等.在这种情况下,是否应优先选择上述解决方案中的一种或另一种,还是有更好的替代方案?
编辑2:再次感谢您的回答和评论,他们确实帮助我思考了这个问题.我已经意识到问题可能出现在两种不同的场景中,理想的解决方案可能各有所不同.
在第一种情况下,考虑例如可能随时间不同的阵列和仅与当前阵列相关的索引.指数在代码之外没有任何意义.Doug Currie和RBerteig是完全正确的:数组应该是基于1的,getIndex应该包含一个+1.如上所述,这允许C和Lua两侧的代码是惯用的.
第二种情况涉及具有含义的索引,并且可能是一个总是相同的数组.一个极端的例子就是names包含的地方"Zero", "One", "Two".在这种情况下,每个索引的预期值是众所周知的,我觉得将Lua端的索引设置为一个是不直观的.我认为应该首选其他方法之一.
我目前正在开发一个Win32程序,它需要一个包含许多子窗口控件的主窗口 - 按钮,列表视图等.我认为构建这样一个窗口的标准方法是首先为主窗口调用CreateWindow,然后再为每个控件调用.
作为一个更简单的选项,我正在考虑使用资源编辑器的对话框设计器设计主窗口,然后使用CreateDialog一次构建主窗口.
通过在对话框模板中使用CLASS语句,我应该能够使主窗口使用自定义窗口类(因此自定义窗口过程),从而避免窗口具有任何类似对话框的行为.这种技术的一个例子可以在Charles Petzold的"Programming Windows"中找到:第11章中的HEXCALC程序.
以这种方式创建主窗口有什么缺点吗?如果是这样,他们是什么?如果没有,为什么这种方法很少使用?
我有以下C代码:
#include <stdint.h>
#include <stdio.h>
int i;
uint64_t a[] = { (uint64_t)&i, (uint64_t)&i + 0x8000000000000000 };
int main() {
printf("%p %llx %llx\n", &i, a[0], a[1]);
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Microsoft Visual Studio Community 2015编译它(作为C或C++)然后运行它,输出类似于以下内容:
013E9154 13e9154 13e9154
Run Code Online (Sandbox Code Playgroud)
看起来,+ 0x8000000000000000我希望设置高位的代码a[1]已经被默默地忽略了.
但是,如果我移动a内部的初始化main,输出就是我所期望的:
00179154 179154 8000000000179154
Run Code Online (Sandbox Code Playgroud)
有了a全球性,为什么要默默地忽略这个添加?尝试添加是否应该实际设置高位a[1]或是否应该导致编译器错误?
有趣的是,如果+ 0x8000000000000000上面的代码被替换为| 0x8000000000000000,我得到"错误C2099:初始化程序不是常量".
编辑:即使没有强制转换,也会出现类似的问题.编译为x64,以下代码打印相同的值(例如000000013FB8D180)三次:
#include <stdio.h>
int i;
int * a[] = { &i, &i + 0x100000000 };
int main() …Run Code Online (Sandbox Code Playgroud) c compiler-errors visual-c++ language-lawyer constant-expression
此页面列出了C99中新增的53个功能(即它们是C99但不是C89).所有这些功能都在C++中吗?甚至是C++ 98?
如果没有,哪些功能在C++中,哪些不是?
在 Python 中,我可以使用@classmethod装饰器创建一个类方法:
>>> class C:
... @classmethod
... def f(cls):
... print(f'f called with cls={cls}')
...
>>> C.f()
f called with cls=<class '__main__.C'>
Run Code Online (Sandbox Code Playgroud)
或者,我可以在元类上使用普通(实例)方法:
>>> class M(type):
... def f(cls):
... print(f'f called with cls={cls}')
...
>>> class C(metaclass=M):
... pass
...
>>> C.f()
f called with cls=<class '__main__.C'>
Run Code Online (Sandbox Code Playgroud)
如 的输出所示C.f(),这两种方法提供了相似的功能。
@classmethod在元类上使用和使用普通方法有什么区别?
c ×3
python ×3
lua ×2
winapi ×2
async-await ×1
asynchronous ×1
c++ ×1
c89 ×1
c99 ×1
class-method ×1
coroutine ×1
createwindow ×1
css ×1
data-binding ×1
directdraw ×1
directx ×1
findancestor ×1
gdi ×1
html ×1
image ×1
javascript ×1
lua-table ×1
metaclass ×1
methods ×1
scaling ×1
visual-c++ ×1
windows ×1
wpf ×1
xaml ×1