2016-01-05 38 views
2

我將C++應用程序到C#,我已經在代碼庫中的許多地方遇到的這一行代碼:Application-> ProcessMessage是做什麼的?

Application->ProcessMessages() 

我發現這個鏈接:http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TApplication_ProcessMessages.html

它說ProcessMessages()做如下:

調用ProcessMessages以允許應用程序處理當前位於消息隊列中的消息。 ProcessMessages循環Windows消息循環,直到它爲空,然後將控制權返回給應用程序。

但什麼是「消息」,什麼是「消息隊列」?消息如何被添加?什麼樣的處理完成?

我似乎無法找到任何具體解釋,這是什麼,這很重要,因爲我不知道這個方法調用的C#/ .NET等價物是什麼,或者它在某些情況下的功能形狀或方式只是烘烤到.NET中,我不需要做任何事情?

用C#標記問題,因爲我最好奇它的.NET等價物,但線程的真正目的僅僅是理解C++所關心的是什麼。

+1

你爲什麼不[學習](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632586(v = vs.85).aspx)它自己?如果要直接跳轉到消息,請從[此處](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v = vs.85).aspx)開始。 – Sinatr

+2

這是臭名昭着的「DoEvents」。每個GUI庫都允許這樣做,它應該[永遠不會被使用](http://stackoverflow.com/a/5183623/17034)。 –

回答

6

.NET等價物是Application.DoEvents()

消息泵是Win32 messaging system,它實際上是Windows本身的通信機制。如果你移動你的鼠標,點擊一個按鈕等,發送一條消息。一方(您的應用程序,Windows本身等)能夠處理它,並處理下一條消息。消息泵繼續通過放入隊列中的消息進行發送。

Application.DoEvents()將爲您的同步代碼提供處理這些事件的機會,但最好讓代碼異步,以便UI線程不會被阻塞,並且可以毫不拖延地正常處理消息。

不要使用Application.DoEvents()除非你真的知道你在做什麼,並且know it can bring trouble

+0

雖然異步代碼和Application.DoEvents()都有一個共同的關鍵問題,它們允許重入。哦,所有的漏洞抽象...... :) – Luaan

+0

'DoEvents()'是一種解決方法,但它可以[自己的問題](http://stackoverflow.com/q/5181777/1997232)。如果可以的話,不要使用它。 – Sinatr

+0

確實。感謝您強調@Sinatr。通常這是一個糟糕的設計指標。 –

3

ProcessMessage函數允許應用程序處理排隊的窗口消息。

Windows通過消息工作,每個事件(鼠標移動,點擊,按鍵,重繪等)都是發送到窗口的消息。 .net中的所有過程都會自動處理,因此您無需擔心爲每個窗口編寫了WNDPROC

所以,我相信你會在繁重的工作循環中有那行代碼。爲了什麼?留出時間到界面刷新自己。

在.net中,您可以使用Application.DoEvents()函數,因爲它將有效地調用ProcessMessages函數。 Source