小编use*_*783的帖子

扩展Python列表(例如l + = [1])保证是线程安全的吗?

如果我有一个整数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)

python multithreading thread-safety python-multithreading

22
推荐指数
2
解决办法
621
查看次数

WPF Data Binding的"RelativeSource FindAncestor"究竟做了什么?

我目前在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不"正常工作".

data-binding wpf xaml relativesource findancestor

21
推荐指数
2
解决办法
7万
查看次数

如何将网页上图像的大小加倍?

我有一个图像,比如尺寸为320 x 240像素,我希望在网页上显示两倍大小(即640 x 480像素).在过去,我已经通过设置这样做width=640img标记.

但是,我刚刚在HTML规范中发现了以下内容:

尺寸属性不用于拉伸图像.

在这种情况下,如何在不违背规范意图的情况下将网页上的图像大小加倍?

html javascript css scaling image

20
推荐指数
3
解决办法
1131
查看次数

为什么不使用GDI重复填充数组中RGB数据的窗口?

这是这个问题的后续行动.我正在编写一个简单的游戏,我正在寻找在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)

鉴于这些数字:

  • 为什么许多人坚持认为GDI对于此操作来说太慢了?
  • 有没有理由比SetDIBitsToDevice更喜欢DirectDraw或Direct3D?

以下是每个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)

directx winapi gdi directdraw

16
推荐指数
1
解决办法
1975
查看次数

Python中的协程如何与Lua中的协程相比?

对于在Lua协程的支持是由提供的功能在coroutine,主要是create,resumeyield.开发人员将这些协同程序描述为堆栈,一流和非对称.

协程也可在Python,或者使用增强发电机(和yield from)或在3.5版本中增加,asyncawait.

Python中的协程如何与Lua中的协程相比?它们是堆叠的,一流的还是不对称的?

为什么Python的需要如此多的结构(async def,async with,async for,异步内涵,...)的协同程序,而Lua中能为他们提供只有三个内建的功能呢?

python lua asynchronous coroutine async-await

16
推荐指数
1
解决办法
1242
查看次数

在Lua中,我该如何处理来自C的从零开始的数组索引?

在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端的索引设置为一个是不直观的.我认为应该首选其他方法之一.

c lua lua-table

15
推荐指数
4
解决办法
2153
查看次数

Win32:CreateDialog而不是对CreateWindow的多次调用 - 任何缺点?

我目前正在开发一个Win32程序,它需要一个包含许多子窗口控件的主窗口 - 按钮,列表视图等.我认为构建这样一个窗口的标准方法是首先为主窗口调用CreateWindow,然后再为每个控件调用.

作为一个更简单的选项,我正在考虑使用资源编辑器的对话框设计器设计主窗口,然后使用CreateDialog一次构建主窗口.

通过在对话框模板中使用CLASS语句,我应该能够使主窗口使用自定义窗口类(因此自定义窗口过程),从而避免窗口具有任何类似对话框的行为.这种技术的一个例子可以在Charles Petzold的"Programming Windows"中找到:第11章中的HEXCALC程序.

以这种方式创建主窗口有什么缺点吗?如果是这样,他们是什么?如果没有,为什么这种方法很少使用?

windows winapi createwindow

14
推荐指数
4
解决办法
4143
查看次数

为什么这个添加被默默地忽略了?

我有以下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

14
推荐指数
1
解决办法
275
查看次数

C99的所有功能是否也在C++中?

此页面列出了C99中新增的53个功能(即它们是C99但不是C89).所有这些功能都在C++中吗?甚至是C++ 98?

如果没有,哪些功能在C++中,哪些不是?

c c++ c99 c89

14
推荐指数
2
解决办法
837
查看次数

`classmethod` 和元类方法有什么区别?

在 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在元类上使用和使用普通方法有什么区别?

python methods metaclass class-method

14
推荐指数
1
解决办法
633
查看次数