我在perforce中有一个糟糕的集成更改列表.我想支持它,并且更仔细地重做(并且可能以较小的增量).
我使用Perforce的rollback命令恢复到以前版本的文件,但是当我尝试重做集成时,Perforce声称没有什么可做的.显然,回滚只是简单地还原文件,但对相关的集成相关元数据没有任何作用.因此,当我尝试重新集成时,Perforce认为"您之前已经集成了两个版本 - 现在无所事事".
有什么方法可以撤消涉及集成的变更列表,并让仓库处于我可以实际再次进行集成的状态吗?
这是一个大型项目,集成超过2,000个文件,所以我真的不想被卡住这样做.
我有一个用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) 我理解在使用多重继承时需要虚拟继承 - 它解决了Dreaded Diamond问题.
但是,如果我不使用多重继承怎么办? 是否需要虚拟继承?
我似乎记得听说它对异常很重要(抛出派生类,通过基类引用捕获).但虚拟析构函数不应该足够吗?
我已经尝试过搜索我曾经看过的参考页面,但我似乎无法找到它.
我怎么能等待分离的线程在C++中完成?
我不关心退出状态,我只是想知道线程是否已经完成.
我正在尝试围绕异步的第三方工具提供同步包装器.问题是涉及回调的奇怪的竞争状态崩溃.进展如下:
我想在一个提供阻塞调用的机制中包装它.到目前为止,我有:
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中确定,我对这个问题的猜测是这样的:
我尝试了很多不同的机制来尝试解决这个问题,但没有一个能解决问题.我仍然偶尔看到崩溃.
编辑:更多细节:
这是大规模多线程应用程序的一部分,因此创建静态等待是不切实际的.
我运行了一个测试,在堆上创建Wait,并故意泄漏内存(即Wait对象永远不会被释放),这导致没有崩溃.所以我确定这是等待太快解除分配的问题.
我也尝试过sleep(5)在解锁后进行测试wait,并且也没有发生崩溃.我讨厌依靠这样的kludge.
编辑:ThirdParty详细信息:
我一开始并不认为这是相关的,但我想的越多,我认为这就是真正的问题:
我提到的第三方的东西,以及为什么我无法控制线程:这是使用CORBA.
因此,CORBA可能会比我预期的更长时间地保持对对象的引用.
我已经使用了一段时间的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"很难搜索.
我正在编写模板类,我想允许另一种方法仅存在于某种模板类型.目前,该方法适用于所有模板类型,但会导致所有其他类型的编译错误.
使这更复杂的是它是一个重载的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++),我在代码中找到了一个我要更改值的点(通过调试器).所以现在,我有一个断点设置,我做了:
它正在打破这个断点,所以我想自动化这个.我想设置断点来运行宏,并继续执行.
但是,我没有编写VisualStudio宏的经验,所以我不知道修改执行程序变量的命令.我环顾四周,但到目前为止还没有在网上找到任何帮助.