C++控制台程序怎样使主函数无限循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++控制台程序怎样使主函数无限循环相关的知识,希望对你有一定的参考价值。

如题

for(;;)和while(TRUE)都是无限循环,只有break或者return跳出

PeekMessage不会阻塞,最后一个参数传PM_NOREMOVE,不会将消息从队列取出,可以用于检测消息队列是否有消息。有时候,当我们使用全局变量之类的方式进行线程间交互,PeekMessage很有用。

比如你用一个全局变量BOOL bStop表示线程是否停止,主线程bStop设为TRUE就是通知工作线程结束
if(PeekMessage(&iMsg,NULL,0,0,PM_NOREMOVE))

if(!GetMessage(&iMsg,NULL,0,0))
return iMsg.wParam;

TranslateMessage(&iMsg);
DispatchMessage(&iMsg);

else

if (bStop)
break;/*结束*/

追问:
我有一个程序是多线程,采用win32控制台程序编写,通过scoket对端口进行监听。
但是为了将程序最小化到托盘,采用了消息循环,但是不知道如何将监听的代码放到循环里,所以增加了一个线程专门用来监听。有没有更好的解决办法?
另外,消息循环放在主线程,对端口监听放在另一个线程里。采用上面哪个消息循环好。采用消息循环的目的是为了将窗口托盘化。
追答:
一般来说,你这种情况,主线程是界面线程,处理界面消息的,工作线程只用于网络相关操作,你的问题只在于主线程,如何能够响应界面上点了最小化按钮,是吧?

GetMessage后,取出了消息保存在iMsg中,DispatchMessage(&iMsg);会根据iMsg结构体保存的窗口句柄,去掉用对应的窗口消息处理函数,这个回调函数应该是你在注册窗口类时定义了的。在这个函数中,处理最小化消息。

最小化,是通过WM_SYSCOMMAND消息发送的,wParam等于SC_MINIMIZE时代表最小化
参考技术A while(1)

//始终为真,一直循环。
参考技术B int main(void)

while(true)

printf("无限循环");

return 0;
本回答被提问者采纳
参考技术C while (1) 参考技术D while(1)
for(;;)

如何使用 p/invoke 终止从 C# 调用的 C++ 函数

【中文标题】如何使用 p/invoke 终止从 C# 调用的 C++ 函数【英文标题】:How to Terminate a C++ Function Called form C# Using p/invoke 【发布时间】:2015-08-07 21:10:57 【问题描述】:

我正在使用 p/invoke 从 C# 调用 C++ 函数,该函数有一个无限循环(将帧捕获到文件中),当 C# 中发生事件时应该将其中断。

我怎样才能打破那个循环(终止那个函数)?

我尝试在 C# 的线程中运行此函数,并在需要终止时中止该线程。 但中止功能不起作用

Thread thread = new Thread(myMethod);
thread.Start();

// to terminate the function
thread.Abort();     //didn't respond

【问题讨论】:

能不能修改C++函数,还是不能控制? 我可以修改它。基本上它会录制视频,直到用户在 C# GUI 中点击“停止录制”。 【参考方案1】:

可能最安全的方法是做两件事:

    公开另一个名为(例如)StopRecording 的函数,该函数在您的本机代码中设置一个全局变量 在您的 main 函数中,在每次循环迭代开始时检查全局值,以查看是否已调用 StopRecording(如果是,则退出循环)

这让它自然终止,而不需要任何严厉的终止。

【讨论】:

取消回调会更好 这是另一个不错的选择,但对于像这样的简单案例来说,可能比必要的复杂。除了 P/Invoke 签名之外,请求将在事件处理程序被调用时停止。 其实恰恰相反。您的方法更复杂,因为它强制使用第二个线程,或者类似于 VB 的DoEvents。回调可以避免所有这些。 代码运行无限循环,无论如何都不能在UI线程上运行。回调解决方案也需要两个线程。 在这两种情况下都有两个线程 - UI 线程(必须保持响应,以便根据问题的要求接收输入事件以停止处理)和运行帧捕获的线程.

以上是关于C++控制台程序怎样使主函数无限循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 Detours 扩展程序内函数而不进入无限循环?

Qt 循环中加入QCoreApplication::processEvents退出后台运行

C ++,如何使用键盘输入控制程序流程

如何使 WSAAsyncSelect 在应用程序控制台中启动?

无限循环计算阶乘问题

如何在导航控制器中创建无限循环,如 iphone 中的 instagram 应用程序?