Articles of multithreading

如何从C#中的工作线程发布UI消息

我正在用C#编写一个简单的Winforms应用程序。 我创build了一个工作线程,我希望主窗口响应完成工作的步骤 – 只需更改文本字段testField.Text =“就绪”中的某些文本即可。 我尝试了事件和callback,但是它们都是在调用线程的上下文中执行的,并且不能从工作线程执行UI。 我知道如何在C / C ++中做到这一点:从工作线程调用PostMessage。 我假设我可以从C#调用Windows API,但没有更多的.NET特定的解决scheme?

释放在WPF中创build的命名互斥体Application.OnStartUp():哪个线程拥有它?

我在WPF应用程序的OnStartup方法中创build一个互斥体。 该程序中没有使用互斥锁,它的唯一目的是防止某些程序同时运行。 如何在应用程序closures时释放此互斥锁? 根据文档 , mutex.ReleaseMutex()必须从创build互斥体的同一线程调用。 然而,这提出了一个问题,因为我不控制调用OnStartup()的线程。 假设我的OnStartup方法如下所示: public partial class App : Application { private Mutex mutex; private bool hasHandle = false; protected override void OnStartup(StartupEventArgs e) { bool createdNew; mutex = new Mutex(false, @"Global\XYZ", out createdNew); try { hasHandle = mutex.WaitOne(5000, false); if (!hasHandle) {/*do stuff*/}; } catch (AbandonedMutexException) { hasHandle = true; […]

multithreading可以在单个处理器系统上实现吗?

我始终遵循multithreading只能在多处理器系统上实现的概念,即多个处理器分配给每个线程,每个线程可以同时执行。 在这种情况下没有调度,因为每个线程都有单独的资源专用于它。 但是我可以在某处读到它,也可以在单处理器系统上执行multithreading。 这是对的吗? 如果是,那么单处理器和多处理器系统有什么区别?

如何获取进程的主线程标识(由其ID标识)?

你能帮我find一个ID进程的主(唯一)线程ID吗? 任务上下文:正在运行的进程(目前)没有窗口,而是(某些)线程。 通缉:仅在主线程中发布WM_QUIT 。 不想要的:在非主线程上使用TerminateProcess或发送WM_QUIT 。

读取互锁variables

承担: A. WIN32下的C ++。 B.使用InterlockedIncrement()和InterlockedDecrement()递增和递减正确alignment的易失性整数。 __declspec (align(8)) volatile LONG _ServerState = 0; 如果我只想读取_ServerState,是否需要通过InterlockedXXX函数读取variables? 例如,我看过如下的代码: LONG x = InterlockedExchange(&_ServerState, _ServerState); 和 LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState); 目标是简单地读取_ServerState的当前值。 我不能简单地说: if (_ServerState == some value) { // blah blah blah } 似乎有一些WRT这个问题混淆。 我知道寄存器大小的读取在Windows中是primefaces的,所以我认为InterlockedXXX函数是不必要的。 马特·J 好的,谢谢你的回应。 顺便说一下,这是Visual C ++ 2005和2008。 如果这是真的,我应该使用InterlockedXXX函数来读取_ServerState的值,即使只是为了清楚起见,什么是最好的方式去做呢? LONG x = InterlockedExchange(&_ServerState, _ServerState); 当我真正想做的事情是读取它时,这有修改价值的副作用。 不仅如此,如果存在上下文切换,则可能会将该标志重置为错误值,因为在调用InterlockedExchange()准备过程_ServerState的值压入堆栈。 […]

C ++如何从DLL(Windows)的文件名获得进程ID?

我怎样才能从一个文件名获得进程ID? 像: int processId = getProcessIdByFileName("Network.dll"); 顺便说一句,哪个数据types有进程ID? 扩展信息:我有一个DLL的源代码。 这个DLL被加载到一个应用程序,就像其他一些DLL一样。 我想挂钩其他DLL的function。 因此,我需要它们的进程ID(是否有每个DLL的进程ID,如果他们都在一个应用程序下运行? 我怎样才能调用我的DLL里面的其他DLL的函数? 如何得到他们的处理?

types2虚拟主机是否受到与主机操作系统相同的限制?

主机操作系统是否对types2虚拟主机(即VirtualBox)的客户操作系统施加限制? 例如:在Ruby中,创buildsubprocess就像调用fork一样简单。 但是,不支持在Windows上分支,而是必须为multithreading产生一个完整的进程。 据我所知,这是操作系统的一个限制,而不是编程语言。 将Windows作为主机操作系统强制这些限制在Linux客户操作系统? 如何将给客户机操作系统的命令传递给主机操作系统?

挂钩线程创build/终止

是否有可能挂钩到Windows上的线程终止? IOW,如果进程中的线程(对其他进程和线程不感兴趣)已经终止(通常或者更重要 – 强制),我希望得到通知。 另外,挂钩到线程创build也可以。 理由:我有一个基于每个线程pipe理一些信息的库(把它想象成一个进程范围内的每个线程caching来获取一些信息)。 当线程被终止时,我必须从caching中删除所有线程特定的信息。 [caching关联是通过使用线程ID来实现的,这些线程可能会被重用于将来的线程。] “正常”执行顺序没有问题,因为库用户将从库中分离当前线程,这将清除状态。 如果有人杀死拥有caching资源的线程,就会出现问题。

识别处理器(核心)由特定线程使用

我想知道是否有可能确定物理处理器(核心)是由具有特定线程ID的线程使用? 例如,我有一个multithreading的应用程序有2个线程(例如,threadid = 10和threadid = 20)。 我在具有双核处理器(核心1和核心2)的系统上运行应用程序。 那么,如何知道threadid为20的线程使用的核心数呢? PS Windows平台。 谢谢, 丹尼斯。

SetThreadPriority和SetPriorityClass

我不明白如何使用SetThreadPriority和SetPriorityClass来降低和增加一个线程的优先级。 我的理解是, SetPriorityClassselect可用于进程的优先级范围, SetThreadPriority设置类内的相对优先级。 例如,对于一个线程执行此操作的结果是什么: SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN); SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 感谢帮助。