操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    簡述: APP消息循環和模態對話框中局部消息循環的關系

    根據上圖可以看出,在APP的消息循環再派發ONOK消息后,調用的響應函數,pWnd->OnOk();在該消息中,

    會 進入模態對話框的消息循環,除非將模態對話框關閉,否則APP的函數一直出不來。

    一旦創建了模態對話框,進行局部消息循環,那么APP的消息循環就被阻斷。整個程序的消息循環有模態對話框中得消息循環取代。所以給父窗口發送的非窗口消息,一樣可以響應。

    由于局部消息循環只在對話框中的一個響應函數中,而全局的消息循環也被阻斷,局部循環一直運行,如果用戶不進行處理并關閉模態對話框,該循環會一直不退出。其他對話框也得不到處理。

    1.模態對話框有自己的消息循環,而非模態對話框沒有自己的消息循環,所以在異步線程里創建了一個非模態的窗體此窗體會一閃而過(無消息循環不能處理各種消息事件),而在本線程里創建則是共享本線程的消息循環不會閃退。2.本線程里創建模態對話框A后,A的消息循環活動而本線程(主UI線程)被阻塞。

    2.模態對話框在創建后,主程序的的消息循環是空的(除非對話框給主程序發送消息就另當別論了),就是與系統消息循環斷開聯系了模態對話框是什么時候實例的對話框,而進入了自己獨有的一個消息循環。 然而非模態對話框在創建后立即返回,并且和主程序共用一個消息循環。

    3.可以直接調用消息響應過程函數,即發送“::(新對話框的hWnd,,0,0);”來調用消息響應過程函數來關閉新對話框。

    4.1當通過方法來顯示一個模態窗體時:調用該窗體的Close方法后,只是隱藏了該窗體,仍然可以訪問該窗體,并可以取得該窗體上控件的值,而且還可以通過方法重新顯示該窗體。當調用該窗體的方法時,等于釋放了該窗體所占有的資源,但該對象任然存在,可以訪問該窗體,也可以取得窗體上控件的值,但是不能再通過方法重新顯示該窗體。

    4.2當通過Show方法來顯示一個非模態窗體時,情況就簡單許多,因為Close方法和方法是一樣的,他們都調用了帶一個參數的方法。所以調用模態對話框的close后關閉不了窗體需要才能關閉。

    5.1本線程里創建模態對話框A后模態對話框是什么時候實例的對話框,A的消息循環活動而本線程(主UI線程)被阻塞。當在主線程里有一個方法包含A的close時,由于close實質調用的也是一種消息,該消息并不會釋放A的資源(只是隱藏窗體而已),所以如果此時用close可以關掉模態對話框A,但是如果再本線程里又創建了一個模態對話框B,再A.close()時則不會關掉A,因為A只是隱藏了,此時只有B的消息循環處于活動中,B的消息循環里依然可以分配各個窗口的消息隊列并分發給相應窗體來調用消息響應過程函數,所以A仍然可以使隱藏的A顯示并處理部分消息事件。

    模態框_bootstrap模態框傳值_模態對話框是什么時候實例的對話框

    5.2異步線程里創建模態窗體后能被close,是因為異步線程也隨著窗體的close關閉了,自動調用了等釋放資源。2.而本線程創建的模態窗體(假如此時在主UI窗體線程里又依次創建了模態窗體A和模態窗體B,先通過句柄查找窗體然后調用A.close,這時關閉不了。當調用B.close時能關閉,然后再調用A.close才有效)由于共享本線程里被激活的活動的UI窗體的消息循環,雖然close(實質上模態窗體的close是隱藏并不調用銷毀釋放資源等函數,非模態的close可以釋放資源,注意:非模態窗體沒有自己的消息循環)了但是還能有顯示等消息事件的處理,因為同一個線程的唯一的活動的消息循環都是共享的,每個窗體都有自己的消息循環,但是活動的消息循環只有一個,其他的窗體的消息循環被后來創建的模態窗體阻塞,而最后創建的模態窗體的消息循環進入活動狀態,相當于while循環里不斷套用新的while,即消息循環的嵌套。注意:是直接調用窗體的消息響應過程函數,模態窗體的并不是阻塞線程,只是阻塞了父窗體即其他模態窗體的消息循環,與sleep不同,故雖然同一線程里有很多模態窗體并,但是這些窗體都能被間接通過調用,或通過查找句柄的方式來調用某些窗體的操作(這時線程不是阻塞的,只是依次的上級消息循環被阻塞,但是活動的消息循環是各個模態窗體共享的,所以其他的模態窗體人盎然能夠接收處理部分消息和事件,只是某些系統的消息事件如按鍵鼠標等被屏蔽了,這些系統消息只有在活動的消息循環的模態窗體里采能被有效處理這時機制)。

    6.實例驗證

    Task.Factory.StartNew(() => {
                        Frm frm = new Frm();  
                        Task.Factory.StartNew(() => {
                           ?Thread.Sleep(5000);
                           ?frm.Invoke(new Action(() => {?MessageBox.Show("Box"); }));
                        });
                        frm.ShowDialog();
                    });如此線程創建的窗體,即使被別的地方根據句柄查找控件把frm.close了,也還能顯示,因為messagebox對話框有自己的消息循環,可以讓隱藏的frm顯示和處理各種消息,除非不彈messagebox,這樣此線程就沒有活動的消息循環了自然可以退出線程釋放frm(分析:5秒后messagebox的消息循環被激活,frm的消息循環被阻塞,這個線程的frm和messagebox共用messagebox的消息循環)。

    7.只有活動的消息循環的窗體再執行close時才會有效,因為close相關的消息在阻塞的消息循環的窗體不會被執行,所以如果同一個線程里有多個模態窗體,且被close的窗體的消息循環被阻塞的話,此窗體雖然能共享活動的消息循環的窗體但是部分系統消息控件消息及事件會屏蔽(因為只有活動的消息循環的窗體才能完全接收和處理各種消息事件,其他窗體重入共享消息循環的窗體只能處理部分如重繪等消息事件),所以才會出現close不掉的情況。消息循環嵌套阻塞,類似于while循環阻塞。

    bootstrap模態框傳值_模態對話框是什么時候實例的對話框_模態框

    8.當使用發送相關消息給被阻塞的消息循環的窗體時應該都是可以有效的,因為是直接將消息發送到本線程中共享的消息隊列中去了。而通過句柄查找窗體直接調用close的方式并不是發送的消息。

    MFC中關閉窗口的幾種辦法:

    退出程序用()->();

    關閉當前窗口用( );

    關閉模式對話框用(0);

    9.MFC實例解釋如下所示

    一個典型的Win32項目(不是MFC項目,只有一個窗口的項目),其中的消息循環會使用如下代碼實現:

    //代碼段1

    MSG msg

    BOOL bRet;

    while( (bRet = ( &msg, NULL, 0, 0 )) != 0)

    bootstrap模態框傳值_模態框_模態對話框是什么時候實例的對話框

    {

    if (bRet == -1)

    {

    // the error and exit

    }

    else

    {

    (&msg);

    (&msg);

    }

    }

    模態框_模態對話框是什么時候實例的對話框_bootstrap模態框傳值

    ()是取得消息,如果沒有消息,線程阻塞在這里,不占用CPU。

    ()是將消息分發,分發到所有在這個線程中創建的窗口的窗口處理函數中去。 如果不需要分發消息,就不需要調用(),例如線程中沒有窗口的情況。

    線程消息循環:

    實際上,任何線程只要調用了上述代碼段1中的代碼,就已經實現了消息循環的功能。更進一步,其實只要調用()函數就可以了。

    即:

    //代碼段2

    BOOL bRet; MSG msg;

    while( (bRet = (&msg, NULL, 0, 0)) != 0)

    {

    if (bRet == -1 || == msg.){

    // the error and exit

    bootstrap模態框傳值_模態框_模態對話框是什么時候實例的對話框

    break;

    }

    }

    在工作線程中,只要有代碼段2,就可以實現消息循環的功能了。

    這是一個很方便的線程間異步通信的機制。給線程發消息用()。為什么去掉了()呢,因為一般情況下,在工作線程中是不需要創建窗口的,不需要分發到窗口中去處理,能從線程的消息隊列里取得消息就足夠了。

    如果設計線程的初衷為:當某條件發生時,讓工作線程開始工作,一直將工作完成,之后掛起,等待新條件的發生,等待時不占用CPU資源。 那么代碼段2所展示的機制就能很好的完成這樣的功能。 而且可以使多個工作線程都用同樣的機制實現,彼此間協同工作,加之某種資源共享機制,可以實現一個異步的消息處理鏈。

    模態對話框:

    消息循環可以有多個,可以在上一級消息循環的某個消息的處理過程中,局部創建一個消息循環,模態對話框就是采用這種機制創建出來的。

    一個線程可以有多個消息循環,并行的消息循環顯然沒有意義,多個就是在消息循環中嵌套消息循環。

    如代碼段1中的函數,將消息派發到窗口的消息處理函數中,()。

    現在假設在()中創建一個消息循環,并且只取得這個窗口本身的消息 (&msg, hWnd, 0, 0),不必了,因為已經找到了目標窗口,然后用這個窗口真正的消息處理函數去處理。 這樣模態對話框存在時,處理了所有的窗口消息,創建模態對話框的窗口就一直得不到處理消息的機會,模塊對話框就始終處于最上層,直到其主動退出。

    當然,對模態對話框的這種解釋是簡化了的,實際過程可能復雜的多,取得的窗口消息至少要包含所有的子窗口的消息,也需要到相應的子窗口,等等。但是最基本的機制應該就是這樣的。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有