Articles of multithreading

Direct2D中的multithreading

我正在尝试创build一个简单的D2D游戏引擎(它至less必须能够在窗口中显示和移动图像),并且一切正常,直到决定切换到multithreading版本。 我阅读这篇 MSDN文章,并build议从多个线程使用一个multithreading工厂。 但是这篇文章声称,有几个单线程工厂会更有效率(尽pipe本文描述了服务器端渲染场景,原理与我的情况相同,我错了吗?)。 当我尝试使用单线程工厂的方法时,所有的图像都被显示和移动,但是有可怕的闪烁。 在我的WM_PAINT处理程序,我试图做这样的事情: for (CSingleThreadEngine *pElSingleThreadEngine : m_SingleThreadEngines) //each CSingleThreadEngine instance has its own D2D factory and an image collection pElSingleThreadEngine->Draw(); 和pElSingleThreadEngine-> Draw()是这样画的: m_pRenderTarget->BeginDraw(); m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); for (CGameImage *pImage : m_GameImages) { if (FAILED(pImage->Draw())) throw runtime_error("An object cannot be drawn"); } m_pRenderTarget->EndDraw(); 我认为这里的错误是只有一个窗口有几个ID2D1HwndRenderTarget实例,因为如果我在单独的窗口中绘制每个线程,它就可以工作。 但是我只想在一个窗口中绘制,而且我无法避免为此使用多个ID2D1HwndRenderTarget实例。 所以我的问题是: 创buildmultithreadingDirect2D应用程序的最佳做法是什么? 如果我正在使用的方法是正确的,我在做什么错了,我该如何解决? 任何帮助将不胜感激。

从C#调用WaitForSingleObject

我正在尝试从C#中调用WaitForSingleObject方法,如下所述: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx 为了调用这个函数,我需要创build一个Handle,或者我需要得到一个IntPtrtypes的Handle,怎么做? 我试过这个function,我发现: http : //www.pinvoke.net/default.aspx/kernel32.WaitForSingleObject [DllImport("coredll.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)] public static extern IntPtr CreateEvent(HANDLE lpEventAttributes, [In, MarshalAs(UnmanagedType.Bool)] bool bManualReset, [In, MarshalAs(UnmanagedType.Bool)] bool bIntialState, [In, MarshalAs(UnmanagedType.BStr)] string lpName); 或者,例如,当我从控制台获取句柄时: IntPtr handle = Process.GetCurrentProcess().MainWindowHandle; 它抛出一个DllNotFoundException。 这里有什么问题? 我需要它来运行这个函数调用的过程,并从它的过程中获取一个转储,用于我的ClrMd库学习。 任何帮助将不胜感激。 代码示例: static void Main(string[] args) { var autoEvent = new AutoResetEvent(false); […]

获取进程主线程的句柄

我在一些小的testing应用程序中创build了一个额外的线程,并希望从这个额外的线程挂起主线程。 额外的线程是通过CreateRemoteThread从外部进程创build的。 由于SuspendThread需要一个HANDLE来挂起线程,我想知道如何从我的附加线程中运行的代码中获得这个HANDLE 。

Windows API类似于pthread_cancel?

是否有一个Windows的本地API类似于pthread_cancel,pthread_testcancel等? 如果不是,我们如何在Windows中使用pthread_cancel机制来模拟取消另一个线程?

在编译boost时,“threading = multi”究竟是做什么的?

我不完全确定在构buildboost时, threading=multi标志究竟是做什么的。 该文件说: Causes the produced binaries to be thread-safe. This requires proper support in the source code itself. 这似乎不是很具体。 这是否意味着访问,例如,提升容器是由mutexes/locks或类似的守卫? 由于我的代码的性能是至关重要的,我想尽量减less不必要的互斥体等。 一些更多细节: 我的代码是一个插件DLL,它被加载到一个multithreading的第三方应用程序中。 我静态链接升压到DLL(该插件是不允许有除标准的Windows DLL的任何其他依赖项,所以我被迫这样做)。 虽然应用程序是multithreading的,但我的DLL中的大部分函数只能从一个线程调用,因此访问容器不需要保护。 我明确地通过使用boost::mutex和friends来防范我的代码的其余部分,这些代码可以从多个线程中调用。 我已经尝试使用threading=multi和threading=single来构buildboost,两者似乎都可以工作,但我真的很想知道我在这里做了什么。

我怎样才能保护一个互斥体的载体?

我正在devise一个接受多个不同交互客户端的C ++服务器,并使用向量来分别跟踪所有这些客户端。 不过,我意识到,由于运行了这么多的线程,一个向量可能被两个线程同时读取和写入的可能性很小。 有没有一个快速和安全的方法来添加互斥或东西,以便它将等到所有的读取完成,直到另一个function添加到它? 不这样做可能会搞乱协议,甚至可能导致服务器崩溃。 我有一个想法创build一个全局variables,将所有读取locking向量,但我不知道是否可以告诉线程相互排斥该variables(即不改变布尔为假,并检查它为真同时,这个机制没有意义)。 我正在使用Windows 7(Visual Studio 2010 Pro)。 感谢您的任何和所有的build议!

ReleaseSemaphore不释放信号量

(简而言之,main()的WaitForSingleObject挂在下面的程序中)。 我正在尝试写一段代码来分派线程并等待它们在恢复之前完成。 而不是每次创造线程,这是昂贵的,我把他们睡觉。 主线程以CREATE_SUSPENDED状态创buildX个线程。 同步使用X作为MaximumCount的信号量完成。 信号量的计数器被置零,线程被调度。 他们在进入睡眠之前执行一些愚蠢的循环并调用ReleaseSemaphore。 然后,主线程使用WaitForSingleObject X来确保每个线程完成其工作并正在hibernate。 然后它循环,并再次做到这一切。 有时程序不会退出。 当我喙的程序,我可以看到WaitForSingleObject挂起。 这意味着线程的ReleaseSemaphore不起作用。 没有什么是printf'ed所以没有出错。 也许两个线程不应该在同一时间调用ReleaseSemaphore,但是这将使信号量的作用无效。 我只是不喜欢它… 其他解决scheme同步线程感激地接受! #define TRY 100 #define LOOP 100 HANDLE *ids; HANDLE semaphore; DWORD WINAPI Count(__in LPVOID lpParameter) { float x = 1.0f; while(1) { for (int i=1 ; i<LOOP ; i++) x = sqrt((float)i*x); while (ReleaseSemaphore(semaphore,1,NULL) == FALSE) printf(" ReleaseSemaphore […]

正确的方式来在Python中运行一些超时的代码

我看了网上,发现一些讨论和ActiveState食谱运行一些超时的代码。 看起来有一些常见的方法: 使用运行代码的线程,并使用超时join 。 如果超时 – 杀死线程。 这不是Python直接支持的(使用private _Thread__stop函数),所以这是不好的做法 使用signal.SIGALRM – 但这种方法不适用于Windows ! 使用超时的subprocess – 但是这太重了 – 如果我想要经常开始可中断的任务,我不想为每个进程启动进程! 那么,什么是正确的方法 ? 我不是问变通方法(例如使用扭曲和asynchronousIO),但实际的方式来解决实际问题 – 我有一些function,我想只运行一些超时。 如果超时,我想控制回来。 我希望它能在Linux和Windows上运行。

通缉:不受AbandonedMutexException影响的跨进程同步

我有几个线程获取互斥体,然后终止。 互斥体存储在主存储库中,并在程序存在时正确释放。 但是,当分配一个互斥体的线程存在时,互斥体会自动释放,并随后获取AbandonedMutexException(也根据文档 )。 我怎样才能避免这种exception,即使分配线程完成后仍继续使用互斥锁? .Net中是否有另一个更合适的同步构造,没有这个限制。 注 – 我正在寻找一个跨进程同步机制,它具有与Mutex类似的语义。

在单独的线程中的Python键回显不显示第一个关键笔划

我会尽量发表一个最小的工作示例,但不幸的是,这个问题只是需要很多件,所以我已经把它剥下来,我可以。 首先,我使用一个简单的脚本,通过函数调用来模拟按键。 这是从这里调整。 import ctypes SendInput = ctypes.windll.user32.SendInput PUL = ctypes.POINTER(ctypes.c_ulong) class KeyBdInput(ctypes.Structure): _fields_ = [("wVk", ctypes.c_ushort), ("wScan", ctypes.c_ushort), ("dwFlags", ctypes.c_ulong), ("time", ctypes.c_ulong), ("dwExtraInfo", PUL)] class HardwareInput(ctypes.Structure): _fields_ = [("uMsg", ctypes.c_ulong), ("wParamL", ctypes.c_short), ("wParamH", ctypes.c_ushort)] class MouseInput(ctypes.Structure): _fields_ = [("dx", ctypes.c_long), ("dy", ctypes.c_long), ("mouseData", ctypes.c_ulong), ("dwFlags", ctypes.c_ulong), ("time",ctypes.c_ulong), ("dwExtraInfo", PUL)] class Input_I(ctypes.Union): _fields_ = [("ki", […]