0

我最近开始使用 C++ 而不是 Delphi。有些事情似乎完全不同。例如,我不知道如何初始化 Semaphores 和 CriticalSections 等变量。到目前为止,我只知道 2 种可能的方法: 1. 在构造函数中初始化临界区是愚蠢的,因为每个实例都将使用自己的临界区而不同步任何东西,对吗?2. 使用全局变量并在创建表单时对其进行初始化似乎也不是完美的解决方案。谁能告诉我如何实现这一目标?

对我需要的关键部分做一个简短的解释:我想从不同的线程中填充一个 ListBox。信号量:不同的线程正在移动鼠标,这不应该被打断。

谢谢!

4

2 回答 2

1

与 Delphi 不同,C++ 没有单元初始化/终结的概念(但您已经发现了这一点)。

我们剩下的很少。你需要区分两件事:

  • 在哪里声明变量(全局、静态类成员、类成员、函数本地、函数中的静态——我想这涵盖了所有内容)
  • 初始化变量的位置(因为您关心 C API,您必须自己调用初始化函数)

事实是,在您的情况下,只要您的程序中需要它的所有其他部分都可以访问它,您在哪里声明变量几乎无关紧要,并且关于您应该在哪里初始化它的唯一要求是:在您实际开始使用之前它(这意味着,在您启动其他线程之前)。

在您的情况下,我可能会使用单例模式。但是 C++ 就是这样,单例在初始化期间会遇到竞争条件,没有干净的方法可以解决这个问题。因此,除了您的单例之外,您还应该确保在开始在多线程上下文中使用它之前正确创建它。getInstance()在你的开头一个简单的调用就main()可以了(或任何你认为合适的地方)。如您所见,这只关心您声明变量的位置,而不是初始化变量的位置,但不幸的是,C++ 在多线程方面存在重要限制(未指定),因此无法解决。

总结一下:做你想做的(只要它有效),不要担心。

于 2013-04-25T10:51:08.823 回答
0

在我看来,您只需要一个关键部分来同步来自各个线程的列表框的更新。鼠标将继续移动。信号量不适合解决方案。您在类构造函数中初始化临界区。列表框在哪里。编写一个更新列表框的方法。

//psudo code
UpdateListBox()
{
 //enter critical section
 //update
 //leave critical section
}

所有线程都会调用这个方法来更新列表框。

有关关键部分的信息在这里 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683472%28v=vs.85%29.aspx

于 2013-04-25T10:18:52.717 回答