程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 最近面試遇到的Windows相關的題目,面試windows

最近面試遇到的Windows相關的題目,面試windows

編輯:C++入門知識

最近面試遇到的Windows相關的題目,面試windows


上周准備在公司內部轉崗,面了3個部門windows客戶端相關的工作,最終拿到3個Offer,主要涉及C++和Windows兩大塊內容,C++的題目基本都答上了,Windows一直都是我的弱項,在這裡記錄一下Windows相關的題目。有些答不上的問題就沒列出來,還有些問題忘了,下面的答案有些大部分是我自己的理解,有些是直接從網上copy的,有問題大家可以討論。

1:GetMessage和PeekMessage的區別?

GetMessage:獲取消息隊列中的一個消息,存入MSG中,並從消息隊列中移除,如果消息隊列中沒有消息就會阻塞;

PeekMessage:查看消息,有消息,就將數據存入MSG結構中,沒有消息就返回FALSE,不會阻塞,但如果沒有更新區,可以移除WM_PAINT消息,還可以通過最後一個參數來決定是否從隊列中移除查看的消息;

2:SendMessage和PostMessage的區別?怎麼跨線程發消息?怎麼跨進程發消息?SendMessage在進程間發消息要注意什麼?SendMessage能將消息發送到消息隊列嗎?PostMessage可以在進程間發消息嗎?兩個線程互相SendMessage會出問題嗎?

SendMessage:將一個消息發送到指定窗口的窗口過程中,等窗口過程執行完了再返回;

PostMessage:將消息發送到指定窗口所在線程的消息隊列中,直接返回,消息是否被處理完全不知道;

SendMessage直接調用窗口過程,那它是否可以將消息發送到發送到線程的消息隊列中呢?

可以啊,比如發送一個WM_PAINT消息,這是一個隊列消息,只有存在無效區域的情況下,才會處理WM_PAINT消息;

線程間SendMessage,由於它基本就是調用指定窗口的窗口過程,當跨線程發消息的時候,無法調用指定窗口的窗口過程,在跨線程發送;

消息的時候,發送線程會先掛起,由系統線程將消息發送到接收線程的另一個隊列中,並設置QS_SENDMESSAGE標志,當系統檢測到這個標志後,就會處理這個隊列的消息,當這個消息被處理之後,調用SendMessage的線程就會被喚醒,就繼續執行。

SendMessage是可以跨進程發消息的,通過FindWindow找到對方進程的窗口句柄,發一個消息過去就行了,由於兩個進程間的內存是完全獨立的,不能發指針,如果要發數據,就用WM_COPYDATA。

PostMessage可以在進程間發消息,但不能結合WM_COPYDATA使用,WM_COPYDATA通過內存映射在進程間傳遞數據,PostMessage後映射文件的句柄就無效了。

兩個線程互相SendMessage可能會導致死鎖,A線程鎖住一個資源,向B線程發一個消息,A線程掛起,這時如果B線程在處理A線程的消息需要A線程鎖住的資源,A由於發給B的消息還沒有處理完就一直不能返回,鎖也沒有打開,B線程又用不了,消息也就處理不完,結果就死鎖了。

3:Windows是怎麼實現窗口刷新的?怎麼實現窗口的立即刷新?

Update Region不為空時,系統就會自動產生WM_PAINT消息,通過InvalidateRect和InvalidateRgn可把指定的區域加到窗口的Update Region中,通過處理WM_PAINT消息來實現窗口的刷新。 系統為什麼不在調用Invalidate時發送WM_PAINT消息呢?又為什麼非要等應用消息隊列為空時才發送WM_PAINT消息呢?這是因為系統把在窗口中的繪制操作當作一種低優先級的操作,於是盡可能地推後做。不過這樣也有利於提高繪制的效率:兩個WM_PAINT消息之間通過InvalidateRect和InvaliateRgn使之失效的區域就會被累加起來,然後在一個WM_PAINT消息中一次得到更新,不僅能避免多次重復地更新同一區域,也優化了應用的更新操作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved