小编Tim*_*Tim的帖子

如何在Perforce中撤消集成,并且仍然可以重做它?

我在perforce中有一个糟糕的集成更改列表.我想支持它,并且更仔细地重做(并且可能以较小的增量).

我使用Perforce的rollback命令恢复到以前版本的文件,但是当我尝试重做集成时,Perforce声称没有什么可做的.显然,回滚只是简单地还原文件,但对相关的集成相关元数据没有任何作用.因此,当我尝试重新集成时,Perforce认为"您之前已经集成了两个版本 - 现在无所事事".

有什么方法可以撤消涉及集成的变更列表,并让仓库处于我可以实际再次进行集成的状态吗?

这是一个大型项目,集成超过2,000个文件,所以我真的不想被卡住这样做.

perforce

30
推荐指数
1
解决办法
1万
查看次数

控制台应用程序的C#箭头键输入

我有一个用C#编写的简单控制台应用程序.我希望能够检测箭头按键,这样我就可以让用户转向.如何使用控制台应用程序检测keydown/keyup事件?

我所有的谷歌搜索都导致了关于Windows窗体的信息.我没有GUI.这是一个控制台应用程序(通过串口控制机器人).

我有编写函数来处理这些事件,但我不知道如何注册以实际接收事件:

  private void myKeyDown(object sender, KeyEventArgs e)
  {
      switch (e.KeyCode)
      {
          case Keys.Left:
                 ...
          case Keys.Right:
                 ...
          case Keys.Up:
                 ...
      }
  }

  private void myKeyUp(object sender, KeyEventArgs e)
  {
      ... pretty much the same as myKeyDown
  }
Run Code Online (Sandbox Code Playgroud)

这可能是一个非常基本的问题,但我对C#还不熟悉,而且我以前从未需要这样的输入.

更新: 许多人建议我使用System.Console.ReadKey(true).Key.这没有用.我需要知道按键被释放的时刻,同时支持多个按键.此外,ReadKey是一个阻塞调用 - 这意味着程序将停止并等待按下一个键.

更新: 似乎唯一可行的方法是使用Windows窗体.这很烦人,因为我无法在无头系统上使用它.要求表单GUI接收键盘输入是......愚蠢的.

但无论如何,对于子孙后代,这是我的解决方案.我在.sln中创建了一个新的Form项目:

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            this.KeyDown += new KeyEventHandler(Form1_KeyDown);
            this.KeyUp += new KeyEventHandler(Form1_KeyUp);
        }
        catch (Exception exc)
        {
            ...
        }
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    { …
Run Code Online (Sandbox Code Playgroud)

c# user-input console-application

11
推荐指数
2
解决办法
3万
查看次数

异常需要虚拟继承吗?

我理解在使用多重继承时需要虚拟继承 - 它解决了Dreaded Diamond问题.

但是,如果我不使用多重继承怎么办? 是否需要虚拟继承?

我似乎记得听说它对异常很重要(抛出派生类,通过基类引用捕获).但虚拟析构函数不应该足够吗?

我已经尝试过搜索我曾经看过的参考页面,但我似乎无法找到它.

c++ exception-handling virtual-inheritance

10
推荐指数
1
解决办法
1926
查看次数

等待分离的线程在C++中完成

我怎么能等待分离的线程在C++中完成?

我不关心退出状态,我只是想知道线程是否已经完成.

我正在尝试围绕异步的第三方工具提供同步包装器.问题是涉及回调的奇怪的竞争状态崩溃.进展如下:

  1. 我打电话给第三方,并注册一个回调
  2. 当第三方完成时,它通知我使用回调 - 在一个分离的线程中,我没有真正的控制权.
  3. 我希望(1)中的线程等到(2)被调用.

我想在一个提供阻塞调用的机制中包装它.到目前为止,我有:

class Wait {
  public:
  void callback() {
    pthread_mutex_lock(&m_mutex);
    m_done = true;
    pthread_cond_broadcast(&m_cond);
    pthread_mutex_unlock(&m_mutex);
  }

  void wait() {
    pthread_mutex_lock(&m_mutex);
    while (!m_done) {
      pthread_cond_wait(&m_cond, &m_mutex);
    }
    pthread_mutex_unlock(&m_mutex);
  }

  private:
  pthread_mutex_t m_mutex;
  pthread_cond_t  m_cond;
  bool            m_done;
};

// elsewhere...
Wait waiter;
thirdparty_utility(&waiter);
waiter.wait();
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该有效,而且通常会有效,但有时它会崩溃.至于我可以从corefile中确定,我对这个问题的猜测是这样的:

  1. 当回调广播m_done的结束时,等待线程唤醒
  2. 等待线程现在在这里完成,Wait被破坏.Wait的所有成员都被销毁,包括互斥锁和cond.
  3. 回调线程尝试从广播点继续,但现在使用已释放的内存,这会导致内存损坏.
  4. 当回调线程试图返回时(高于我糟糕的回调方法的级别),程序崩溃(通常使用SIGSEGV,但我已经看过几次SIGILL).

我尝试了很多不同的机制来尝试解决这个问题,但没有一个能解决问题.我仍然偶尔看到崩溃.

编辑:更多细节:

这是大规模多线程应用程序的一部分,因此创建静态等待是不切实际的.

我运行了一个测试,在堆上创建Wait,并故意泄漏内存(即Wait对象永远不会被释放),这导致没有崩溃.所以我确定这是等待太快解除分配的问题.

我也尝试过sleep(5)在解锁后进行测试wait,并且也没有发生崩溃.我讨厌依靠这样的kludge.

编辑:ThirdParty详细信息:

我一开始并不认为这是相关的,但我想的越多,我认为这就是真正的问题:

我提到的第三方的东西,以及为什么我无法控制线程:这是使用CORBA.

因此,CORBA可能会比我预期的更长时间地保持对对象的引用.

c++ multithreading corba pthreads

8
推荐指数
1
解决办法
4447
查看次数

TRY/CATCH_ALL与try/catch

我已经使用了一段时间的c ++,而且我熟悉正常的try/catch.但是,我现在发现自己在Windows上,在VisualStudio中进行COM开发编码.代码的几个部分使用如下代码:

TRY {
    ... do stuff
} CATCH_ALL(e) {
    ... issue a warning
}
END_CATCH_ALL;
Run Code Online (Sandbox Code Playgroud)

这些宏有什么意义?它们对内置的try/catch有什么好处?

我试过谷歌搜索,但"尝试与TRY"很难搜索.

c++ exception-handling

7
推荐指数
1
解决办法
5697
查看次数

我可以在成员函数上使用boost :: enable_if吗?

我正在编写模板类,我想允许另一种方法仅存在于某种模板类型.目前,该方法适用于所有模板类型,但会导致所有其他类型的编译错误.

使这更复杂的是它是一个重载的operator().不知道我想要做什么实际上是可能的.

这就是我现在拥有的:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);
    typename T const& operator() (const Utility2<BASE>& foo) const;
};
Run Code Online (Sandbox Code Playgroud)

我希望T&版本始终可用,但T const&只有Utility2<BASE>有效版本才可用.现在,两种方法都存在,但如果Utility2<BASE>无效,尝试使用const版本会产生奇怪的编译错误.我宁愿有一个明智的错误,甚至是"没有这样的成员函数"错误.

这可能吗?

编辑:阅读了升级文档,这是我提出的,它似乎工作:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);

    template<typename U>
    typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
    operator() (const U& foo) const;
};
Run Code Online (Sandbox Code Playgroud)

因此,除非有人试图将它与Utility2一起使用,否则它不存在,并且如果它对该BASE类型有效,则它们只能创建一个Utility2.但是当它对BASE类型无效时,MyClass不会浪费时间创建访问器方法.

c++ templates boost enable-if

7
推荐指数
1
解决办法
3908
查看次数

Visual Studio Breakpoint宏来修改值?

我正在调试一个应用程序(C++),我在代码中找到了一个我要更改值的点(通过调试器).所以现在,我有一个断点设置,我做了:

  • 调试器到达断点
  • 我修改了我想要改变的变量
  • 我按F5继续跑
  • 泡沫,冲洗,重复

它正在打破这个断点,所以我想自动化这个.我想设置断点来运行宏,并继续执行.

但是,我没有编写VisualStudio宏的经验,所以我不知道修改执行程序变量的命令.我环顾四周,但到目前为止还没有在网上找到任何帮助.

c++ debugging macros visual-studio-2008 visual-studio

6
推荐指数
1
解决办法
3590
查看次数