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