關閉程式後,子執行緒未正確退出引出的記憶體洩露問題
記憶體洩露資訊如下:
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141)
: {239} normal block at 0x003AADA8, 46 bytes long.
Data: <| Ox > 7C D9 4F 78 0E 00 00 00 0E 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {237} normal block at 0x003AAD38, 48 bytes long.
Data: <| Ox > 7C D9 4F 78 0E 00 00 00 0F 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306)
a CWinThread object at $003AACB8, 68 bytes long
經查資料:
strcore.cpp 洩露 是由於CString 引起的
thrdcore.cpp 是由於執行緒未能正確退出引起的。
問題是,我仔細檢查了cstring的使用 凡是 GetBuffer的地方 都release掉了 ,應該沒問題了
那最主要因素還是執行緒的原因。
分析:
關閉對話方塊,此時執行對話方塊解構函式,在解構函式末尾,會強制關閉子執行緒函式。
問題就出現在這裡了:
由於,子執行緒是強制關閉的, 所以子執行緒未執行完畢就被關閉了,因此,子執行緒所用到的資源未能及時釋放,由此引起了記憶體洩露
解決方法: 在關閉主程式後,不要強制關閉子執行緒,而是讓他也自動關閉
第一步: 建立全域性變數
BOOL g_bIsValid=FALSE; // 子執行緒迴圈條件
HANDLE g_hEvent=NULL; // Event事件
第二步: 在建立執行緒前,建立一個無訊號的event事件
g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
第三步: 設定子執行緒迴圈條件,並在迴圈結束後,設定EVENT事件
while (g_bIsValid)
{
...
}
SetEvent(g_hEvent);
第四步: 在主程式的解構函式中,修改g_bIsValid 並呼叫WaitForSingleObject(g_hEvent,INFINITE); 等待事件狀態改變,而不是直接關閉程式。若事件狀態改變 ,則意味 子執行緒函式跳出迴圈,可以正常退出
因此,若直接關閉程式,則子程式可能還沒有正確退出,所以必須要呼叫WaitForSingleObject(g_hEvent,INFINITE); 以保證子執行緒正確退出
g_bIsValid=FALSE;
WaitForSingleObject(g_hEvent,INFINITE);
CloseHandle(g_hEvent);
參考資料:
相關推薦
關閉程式後,子執行緒未正確退出引出的記憶體洩露問題
記憶體洩露資訊如下: f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {239} normal block at 0x003AADA8, 46 bytes long. Data: <
Linux主執行緒接收資料,子執行緒分別對其操作後輸出
本例子雖小,但是融合的執行緒同步,執行緒回收和訊號量的知識。 需要注意pthread_join()和pthread_exit()的用法和區別: pthread_join一般是主執行緒來呼叫,用來等待子執行緒退出,因為是等待,所以是阻塞的,一般主執行緒會依次join所有它建立
jvm堆記憶體溢位後,其他執行緒是否可繼續工作
最近網上出現一個美團面試題:“一個執行緒OOM後,其他執行緒還能執行嗎?”。我看網上出現了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm記憶體分配、作用域、gc等,不是簡單的是與否的問題。 由於題目中給出的OOM,java中
父元件中呼叫子元件,父元件資料更新傳到子元件後,子元件頁面未更新的問題
問題描述:父元件呼叫了一個子元件,傳遞了一個id的屬性到子元件,但是在子元件中將這個id的props屬性賦值給了data裡面定義的另外一個屬性myId,並且寫了watch監聽這個id的props。 結果:第一次的時候子元件並沒有更新介面(即data裡面的myId屬性沒有更新);第二次及以後就
C#當執行緒停止後,由執行緒建立的定時器會繼續執行
測試程式碼 class Program { static System.Timers.Timer timer; static void Main(string[] args) { Th
主執行緒,子執行緒資源衝突,解決方案
問題描述, 我開發的任性動圖軟體,曾經遇到過這樣的問題: 任性動圖有一個功能是塗鴉功能,就是將你的塗鴉過程生成動圖,怎麼實現的呢? 有一個主顯示記憶體,用以顯示介面影象
子執行緒先執行10次,主執行緒執行5次,子執行緒再執行10次,主執行緒再執行5次,如此反覆3次
package com.mhm.test1; /** * 子執行緒跑10次,主執行緒跑5次,然後子執行緒再跑10次,主執行緒再跑5次,往返3次 * @author Mahone * */ p
python程序,主執行緒, 子執行緒的關係
程序是儲存資料的空間,而執行緒是cpu執行的指令。就好比程序是一個房間,執行緒就是房間中的每一個人。所以每一個程序都必定包含至少一個執行緒。程序和執行緒是相對獨立的,但又是相互依賴的。當主執行緒執行完畢後,子執行緒隨即停止。話不多說,直接上程式碼!!!import
vb.net 開啟EXCEL ,關閉程式後,EXCEL程序仍然存在的問題
寫在每段程式的末尾: ReleaseExcel(Excel) GC.Collect() 另有單獨一個可呼叫過程: Sub ReleaseExcel(ByRef o As Object) System.Runtime.I
多執行緒開發(1):主執行緒,前臺執行緒,後臺執行緒,守護執行緒,子執行緒,託管執行緒的關係
1.主執行緒 當一個程式啟動時,就有一個程序被作業系統(OS)建立,與此同時一個執行緒也立刻執行,該執行緒通常叫做程式的主執行緒(Main Thread),因為它是程式開始時就執行的,如果你需要再建立執行緒,那麼建立的執行緒就是這個主執行緒的子執行緒。每個程序至少都有一個
Jni 多執行緒程式設計,子執行緒回撥java方法
由於c++層接收到服務端主動推送tcp資料,所以存在將c++層接收到的socket資料通過層層回撥至java的需求。 以下為c++程式碼段: 1:在c++標頭檔案中定義申明相應回撥函式指標 typedef void (*SwitchStateC
多執行緒情況下,主執行緒先退出,子執行緒會被強制退出嗎
1、程序中執行緒之間的關係 執行緒不像程序,一個程序中的執行緒之間是沒有父子之分的,都是平級關係。即執行緒都是一樣的, 退出了一個不會影響另外一個。 但是所謂的"主執行緒"main,其入口程式碼是類似這樣的方式呼叫main的:exit(main(...))。 main執行完
C++初學者筆記:std::thread,子執行緒阻塞主執行緒的問題
C++ 11 支援跨平臺執行緒啦,當然要嚐嚐鮮 之前用的各平臺執行緒實現方式都不一樣,換個平臺或者換個庫,使用方法就不一樣了 編輯了個小例子,本來以為很容易,誰知道也要撞撞牆。 #include <stdio.h> #include <stdlib.h&g
某團面試題:JVM 堆記憶體溢位後,其他執行緒是否可繼續工作?
轉載註明:http://dwz.win/gHc 最近網上出現一個美團面試題:“一個執行緒OOM後,其他執行緒還能執行嗎?”。我看網上出現了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm記憶體分配、作用域、gc等,不是簡單的是與否的問題。 由於題目中給出的OOM,java中OOM又分很多型別;比如:
正確實現子執行緒任務全部完成後主執行緒關閉的四種方法
方法一 Thread.sleep 方法二 ExecutorService 方法三 thread.join 方法四 Thread.yield and Thread.
putty等終端在關閉視窗後,未關機的主機會繼續執行命令--即後臺執行 nohup
離線後臺下載 nohup command & 例如: nohup make -j32 & 又如: 離線下載伺服器上的程式碼 nohup repo sync -j32 & 螢幕上會顯示下面提示資訊: [email protected]:
openwrt 關閉ssh後,程式繼續執行的方法(備忘)
由於開啟tcpdump來監視網路資料,要長期開著,當關閉SSH後,會出現tcpdump關閉的現象。解決方法,在openwrt中安裝screen軟體,安裝方法opkg update,opkg install screen。安裝完成後,輸入screen回車,在新的介面下,執行t
"Tomcat+Spring+Quartz"解決方案下,關閉Tomcat出現"執行緒未關閉,出現記憶體洩漏"錯誤
使用"Tomcat+Spring+Quartz"解決方案,在關閉Tomcat時出現如圖1所示錯誤資訊:
C# 解決子執行緒不能操作主執行緒UI(介面)問題,涉及到多執行緒的概念。
1、在預設情況下,C#不准許在一個執行緒中直接訪問或操作另一執行緒中建立的控制元件,這是因為訪問windows窗體控制元件本質上是不安全的。 2、執行緒之間是可以同時執行的,那麼如果有兩個或多個執行緒同時操作某一控制元件的某狀態,嘗試將一個控制元件變為自己需要的狀態時, 執行緒的死鎖就可能發生。
Qt子執行緒如何更新UI,完整的程式碼示例,有圖有真相
Qt涉及到大量的資料更新,影象處理,視訊編解碼時,在主執行緒直接進行會讓主執行緒阻塞,程式直接卡死,直達阻塞的部分完成,介面才更新,例如,我們需要在TextBrowser上迴圈顯示資料。 我需要點選【新增新行資料】,然後每隔1秒迴圈顯示資料,之