首先,來分析一個假設的場景:
如果PostMessage傳遞的是一些在棧區的變量,PostMessage后把這些數據傳到另一個線程的消息隊列里,但
由于是棧區上的變量在PostMessage所在函數返回時由系統回收,那么另一線程就會訪問不了這些數據。
解決辦法:在傳送線程PostMessage消息前對棧區上的數據new一份放到堆區上,堆區的數據是程序員手動創
建和手動回收的,然后把這些數據傳送到另一線程,由另一線程去手動釋放delete。
問題的產生:由于工作線程處理的繁忙,有一些數據在UI線程退出時還沒返回,當UI線程退出后,數據返回
由工作線程PostMessage到UI線程,UI線程已經接收不到消息,故未能手動釋放工作線程傳過來的堆區內存,
造成內存泄漏。
后來,查到如下網站:
http://stackoverflow.com/questions/3807945/mfc-data-forwarding-to-main-thread-via-postmessage
發現PostMessage是有返回值的,發送失敗返回false。
故上面的問題有了解決方法:
UI線程(接收線程)退出后工作線程(發送線程)PostMessage是返回false的,故可以利用這個返回值來決定由哪個線程來釋放這段
PostMessage中傳遞的內存,如果傳送失敗,則由當前PostMessage的線程負責手動回收,如果發送成功就由
接收線程來負責手動回收。