Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消息循环如何使用线程? 我有点困惑,怀疑我是否被误导了,在一个单独的帖子里,我被告知“新线程只在你明确地创建它们时才被创建。C++程序默认是单线程的。”当我打开我的程序,没有在OLYDBG中显式地创建新线程时,我注意到有很多次,经常有2个线程在运行。我想在不停止执行的情况下理解消息循环是如何工作的,我得到的解释在解释它是如何工作的方面是非常不够的_C++_Multithreading_Winapi_Messages - Fatal编程技术网

消息循环如何使用线程? 我有点困惑,怀疑我是否被误导了,在一个单独的帖子里,我被告知“新线程只在你明确地创建它们时才被创建。C++程序默认是单线程的。”当我打开我的程序,没有在OLYDBG中显式地创建新线程时,我注意到有很多次,经常有2个线程在运行。我想在不停止执行的情况下理解消息循环是如何工作的,我得到的解释在解释它是如何工作的方面是非常不够的

消息循环如何使用线程? 我有点困惑,怀疑我是否被误导了,在一个单独的帖子里,我被告知“新线程只在你明确地创建它们时才被创建。C++程序默认是单线程的。”当我打开我的程序,没有在OLYDBG中显式地创建新线程时,我注意到有很多次,经常有2个线程在运行。我想在不停止执行的情况下理解消息循环是如何工作的,我得到的解释在解释它是如何工作的方面是非常不够的,c++,multithreading,winapi,messages,C++,Multithreading,Winapi,Messages,消息循环是创建新线程还是占用主线程?如果它接受主线程,那么它是否会在执行所有其他操作后执行,而不考虑代码顺序?如果它不这样做,但仍然占用主线程,它是否会生成一个新线程,以便程序可以执行,而不是陷入消息循环 编辑:通过实验解决了我的大部分问题。消息循环占用主线程和代码后的任何代码: while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&am

消息循环是创建新线程还是占用主线程?如果它接受主线程,那么它是否会在执行所有其他操作后执行,而不考虑代码顺序?如果它不这样做,但仍然占用主线程,它是否会生成一个新线程,以便程序可以执行,而不是陷入消息循环

编辑:通过实验解决了我的大部分问题。消息循环占用主线程和代码后的任何代码:

while (GetMessage (&messages, NULL, 0, 0))
{
    TranslateMessage(&messages);
    DispatchMessage(&messages);
}
return messages.wParam;

由于程序卡在消息循环中,除非执行特殊操作,否则不会执行。在执行的窗口过程中放入无限循环会导致程序崩溃。我仍然不理解多线程的神秘性,当我在奥利的时候,我更喜欢它。

通常启动程序的线程只运行消息循环,占用主线程。任何不属于处理消息或更新UI的工作通常由其他线程完成。即使应用程序没有创建任何线程,也可以通过库或操作系统创建附加线程。Windows将在您的进程内创建线程来处理向消息循环发送事件之类的事情。

也许开始的地方是认识到“消息循环”并不是这样的事情;它实际上只是一条线所做的事情

windows中的线程通常分为两类:拥有UI的线程和进行后台工作的线程(例如网络操作)

一个简单的UI应用程序通常只有一个线程,即UI线程。为了让UI正常工作,线程需要等待一些输入(鼠标点击、键盘输入等),处理输入(例如更新状态并重新绘制窗口),然后返回等待更多输入。“等待输入、处理输入、重复”的整个动作就是消息循环。(在此阶段还值得一提的是消息队列:每个线程都有自己的输入队列,用于存储线程的输入消息;线程“等待输入”的行为实际上是检查队列中是否有任何内容,如果没有,则等待直到有内容为止。)在win32中,如果线程以这种方式积极处理输入,据说这也是“传递信息”

典型的简单windows应用程序的主线代码将首先执行基本初始化,创建主窗口,然后执行等待输入和处理消息循环。它通常在用户关闭主窗口之前执行此操作,此时线程退出循环,并继续执行随后出现的代码,这通常是清理代码

windows应用程序中的一个常见架构是有一个主UI线程(通常是主线程),它创建并拥有所有UI,并有一个消息循环,为线程创建的所有UI发送消息。如果应用程序需要执行一些可能会阻止的操作,例如从套接字读取数据,则通常会使用工作线程:您不希望UI线程阻止(例如,在等待套接字输入时),因为在这段时间内,它不会处理输入,UI最终会无响应

你可以编写一个包含多个UI线程的应用程序——创建windows的每个线程都需要自己的消息循环——但这是一种相当先进的技术,对于大多数基本的应用程序来说并不那么有用


您看到的其他线程可能是Windows创建的用于执行后台任务的某种辅助线程;在大多数情况下,你可以忽略它们。例如,如果您初始化COM,windows可能会创建一个工作线程来管理某些COM内部内容,还可能会创建一些不可见的Hwnd。

您在问我们您的程序是做什么的。我们怎么知道呢?是的,线程确实需要显式创建,但其他库/函数可以根据需要创建它们。如果附加并中断调试器,您还将看到至少一个其他线程。您不必担心它们,但您应该能够从起始地址/调用堆栈中找到它们。因此,一旦主线程到达消息循环,它就会连续执行消息循环,并生成一个单独的线程来执行程序主函数中剩余的内容?我仍然很困惑。@user1958850:这是一种常见的模式——UI线程只是运行IO。其他一切都由其他线程完成,以便UI能够保持响应。