草庐IT

退出后

全部标签

c++ - 退出应用程序调用两次关闭事件

我在OSX上用Qt/c++编写了一个应用程序。退出应用程序时,我正在捕获关闭事件以显示对话框voidMainUI::closeEvent(QCloseEvent*event){if(DeviceUnplugged==false){ExitDialog=newDialogExit;ExitDialog->exec();if(ExitDialog->result()==QDialog::Accepted){m_device.CloseDevice();event->accept();}else{event->ignore();}}}当使用红叉或使用菜单“退出”关闭时,对话框正确显示。但是当

c++ - 从多线程应用程序中高效退出(细节)

我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的来源(每个线程都执行它自己的退出例程)。其中,我喜欢全局原子bool值的想法,它可以从任何线程进行标记,所有其他线程检查此标记以执行退出例程-当所有线程都加入时,主线程然后可以退出应用程序。纯粹的计算线程可能会有不同的处理方式,对吧?这样既高效又安全吗?有更好的方法吗?谢谢! 最佳答案 我不喜欢线程检查bool(或其他)状态变量以了解何时做什么,因为这很浪费。线程将不得不旋转,不断检查变量以查看是否有新指令。这会烧毁CPU。更好的选择是创建一个信号量或在Wi

c++ - 如何在退出时调试 CorExitProcess 中的访问冲突 0xC0000005?

我们的应用程序(用C++编写,VS2010项目)在Windows8之前的所有操作系统上运行良好(现在仍然如此)。然而,在Windows8上,当有序退出应用程序时,会发生访问冲突:mfc100.dll!_DllMain@12()InanMSDNforumtopic建议在退出前运行GC.Collect(),但在退出前不久我无法对这样的调用产生任何影响。我有点不知该如何调试这个问题。据我了解,CorExitProcess负责清理应用程序的托管资源。那么这可能是托管组件中的错误吗?或者更有可能是_DllMain中的某些函数指针已被覆盖/损坏?如果是这样,我将如何在相关地址设置数据断点?有apo

c++ - 如果我收到信号,我的程序的退出代码应该是什么?

我想我可能已经做错了一段时间,因为我们刚刚切换到systemd,它认为我干净利落地终止的进程未成功结束。基本上我会监听SIGHUP、SIGINT和SIGTERM,然后(通过将信号代码传回到main)干净地例如返回128+SIGHUP。我原以为这是用来填充$?的,但现在我想我明白了shell负责给$?这样的值,然后仅当信号未处理时。因此,即使进程最终由于信号而退出,因为信号已被处理,$?最终将变为0并且所有证据表明信号与退出会丢失。是吗?当处理SIGHUP并完全退出时,我是否应该从main中返回EXIT_SUCCESS? 最佳答案 返

c++ - 程序已退出,代码为 -2147483645

我在使用VisualStudio调试混合的WPF/CLR/Unmanagednativec++项目时遇到了一个有趣的(相当烦人的)错误,这个错误只发生在WindowsXP中。似乎我在程序中发生了内存损坏,其范围太大而无法在此处发布。我遇到的问题是,当程序发生崩溃时,它只是在没有VS调试器尝试定位异常的情况下退出,我假设是因为没有抛出任何异常。程序退出代码实际上是我必须继续的唯一信息,它只是最小的int值。有没有人遇到过这种情况,并且可以就其含义向我指出正确的方向?编辑:继续调查问题,我发现有时我可以获得堆栈跟踪和异常,而不是直接退出程序。跟踪将我带到vector分配(推)。在程序刚刚退

c++ - 你怎么知道 main 是否已经退出?

在C和C++中,atexit函数在exit内部调用,或者在main返回后调用(名义上调用exit:__libc_start_main(argc,argv){__libc_constructors();exit(main(argc,argv));).有没有办法查明我们是否在退出序列内?C++全局和局部静态的析构函数是用atexit注册的,所以你的代码当然可以在这个阶段被调用。(有趣的是,在某些平台上,如果您尝试在exit中创建C++本地静态对象,它会在退出锁上死锁!)到目前为止我最好的尝试如下:staticboolmainExited=false;staticvoidwatchMain(

c++ - 保证在突然终止或退出期间在 C++ 中调用的函数

在突然终止或退出期间保证调用C++中的哪些函数可以执行清理事件.. 最佳答案 根据“突然终止”的含义,有几种不同的选择:全局析构函数将在正常终止时调用(从main返回,或调用exit())。atexit()注册一个在正常终止时调用的函数。std::set_terminate注册一个函数,当异常被抛出但未被捕获时,或者当“异常处理由于其他原因必须终止”时将被调用。sigaction()注册当您的程序接收到信号时要调用的函数,其中许多信号通常会突然终止您的程序。当程序处于内部不一致状态时,可能会调用信号处理程序,因此它们的功能极度有限。

c++ - 使用 goto 干净地退出循环

我有一个关于在C++中使用goto语句的问题。我知道这个话题是有争议的,并且对任何笼统的建议或争论不感兴趣(我通常不使用goto)。相反,我有一个特定的情况,想了解我使用goto语句的解决方案是否是一个好的解决方案。我不会称自己是C++新手,但也不会将自己归类为专业级程序员。一旦开始,产生我的问题的代码部分就会在无限循环中旋转。伪代码中线程的大致流程如下:voidControlLoop::main_loop(){InitializeAndCheckHardware(pHardware)//pHardwareisapointergivenfromoutside//Themainloopw

c++ - 输入错误会导致程序退出

看这段代码:#includeusingnamespacestd;intmain(){strings;intn;floatx;again:cout>s>>n>>x>>s;cout>t;if(t=='y'||t=='Y')gotoagain;return0;}只需尝试输入“ABC4567.89XYZ”并按回车键,它会导致程序退出,然后提示用户重试。我知道输入是错误的,它们不属于它们的类型,但为什么会导致退出?以及如何避免这种退出? 最佳答案 改变cin>>s>>n>>x>>s;到cin>>s>>x>>n>>s;当您输入7.8作为第二个输

c++ - 强制应用程序核心转储并退出的正确方法是什么?

我刚刚发现一些代码使用kill系统调用向应用程序发送SIGSEGV信号。这背后的理由是这将迫使应用程序进行核心转储并退出。这对我来说似乎很不对,这是正常做法吗? 最佳答案 如果您希望生成核心转储,SIGQUIT是发送给程序的正确信号。kill是发送信号的正确命令行程序(当然,它的命名很糟糕,因为并非所有信号都会终止程序)。请注意,您不应该向程序发送随机信号,并非所有信号都会产生核心转储。其中许多将由程序本身处理,要么被消耗、忽略,要么引发其他处理。因此发送SIGSEGV是错误的。海湾合作委员会说:http://www.gnu.org