1. 程式人生 > >關於線上程中使用AfxGetMainWnd()出錯的問題

關於線上程中使用AfxGetMainWnd()出錯的問題

AfxGetMainWnd()得到的是當前執行緒的主視窗(如果有的話).
因為主視窗是屬於主執行緒的,所以想得到主視窗HWND值,
只能在主執行緒中用AfxGetMainWnd(),但要不是處在主執行緒中,
AfxGetMainWnd()可能是從當前執行緒查詢主視窗的。但好像
AfxGetMainWnd()不能跨執行緒,故要出錯.要想線上程中使用
主視窗的HWND值,可以把主視窗的HWND值傳給執行緒.也
可以用AfxGetApp()先取得主執行緒,再通過CWinThread的類成
員m_pMainWnd獲得主視窗(AfxGetApp()->m_pMainWnd->m_hWnd)

If AfxGetMainWnd is called from the application's primary thread,
it returns the application'smain window according to the above rules.
If the function is called from a secondary thread in the application,
the function returns the main window associated with the thread that made the call.

今天好像找到原因了~ 我那個執行緒是用CreateThread建立的,而 CreateThread是由
作業系統提供的介面,在 CreateThread建立的執行緒中用MFC的函式AfxGetMainWnd()會有問題.

相關推薦

關於線上使用AfxGetMainWnd()出錯的問題

AfxGetMainWnd()得到的是當前執行緒的主視窗(如果有的話). 因為主視窗是屬於主執行緒的,所以想得到主視窗HWND值, 只能在主執行緒中用AfxGetMainWnd(),但要不是處在主執行緒中, AfxGetMainWnd()可能是從當前執行緒查詢主視窗的。但好像 AfxGetMainWnd()不

UpdateData線上出錯的解決辦法 .

最近在寫一個監視程式,需要定時檢視共享記憶體中的各個值。於是在MFC中,首先開了一個執行緒,用的是boost的timer,每隔1秒讀取共享記憶體中的值,另外一個執行緒通過呼叫UpdateData(FALSE)將值顯示在介面上。但是在我除錯的時候發現,UpdateData一直報錯。 最後查了下,還是執行緒的

C#如何線上修改我的窗體控制元件的text文字

以下辦法實驗成功: 執行緒不能操作窗體控制元件,會引發異常,建議使用委託進行窗體控制元件的操作,包括 改text. 1、定義委託 delegate void SetTextCallback(string text); 2、實現委託 priv

MFC,線上建立對話方塊

UINT CTestDlgDlg::ThreadFunc(PVOID pv){ //模態對話方塊//  CAboutDlg dlg;//  dlg.DoModal(); //非模態對話方塊  CTestDlgDlg *Testdlg = (CTestDlgDlg*)pv;   CDlgThread *dlg

WPF/WinForm線上呼叫提示窗MessageBox阻塞視窗方法

把MessageBox.Show交給主執行緒去處理就可以了public void ShowMessage(string msg) { this.Dispatcher.Invoke

Unity3d C 錯誤提示 禁止線上進行遊戲物件比較

                今天剛剛寫完非同步Socket客戶端的資料收發,在進行測試的時候,Unity報出錯誤: &nb

Unity3d(C#)錯誤提示:禁止線上進行遊戲物件比較!

今天剛剛寫完非同步Socket客戶端的資料收發,在進行測試的時候,Unity報出錯誤: CompareBaseObjectsInternal can only be called from the main thread. 詳情如下: ERROR : CompareB

SpringBoot線上獲取容器的Bean

在 Servlet API 中有一個 ServletContextListener 介面,它能夠監聽 ServletContext 物件的生命週期,實際上就是監聽 Web 應用的生命週期。

Java的NIO非阻塞模式和傳統的IO的阻塞模式線上的資源消耗

       java中的NIO對於需要IO操作的程式來說,大大的提高了效率,但從NIO的實現模式來看(底層select的遍歷),因為其非阻塞的特性,犧牲了更多的系統資源,充分利用了硬體資源。      在java的網路程式設計中,少不了執行緒操作。那麼這兩種模式對系統的消耗

C# 線上訪問控制元件

C#  線上程中訪問控制元件,會丟擲異常 錯誤原因:執行緒間操作無效,從不是建立控制元件的執行緒訪問此控制元件。 解決方法:利用方法:Control.Invoke (Delegate)  詳情:https://msdn.microsoft.com/en-us/library

Qt線上使用QAxObject,獲取物件為空問題

// 初始化QAxObject HRESULT r = OleInitialize(0); CoInitialize(0); if (r != S_OK && r != S_FALSE

C# 線上顯示一個新窗體

在多執行緒中,一個執行緒結束時需要顯示一些結果資訊給使用者,我採用新的窗體來顯示。但簡單的線上程體裡面如下寫private void ThreadFunc() { MsgForm msg = new MsgForm(); msg.Show(); } pri

WinCE7.0_FindWindow函式線上呼叫卡死的現象(2)

/* * 對於同一句FindWindow(NULL,L"TestFindWindow"); * 在按鍵響應中執行,耗時約為: 5ms * 線上程中執行,由於按鍵響應中有 Sleep 存在,耗時約為: 10020ms* Win32 框架下執行的結果與 MFC 相同 * * 按鍵

利用Handler迴圈呼叫自身,實現線上無限迴圈的功能

如果某個功能需要實現無限迴圈,肯定是不能在UI執行緒中執行的,想到的第一種辦法肯定是放在新建的執行緒裡。 但是開闢新執行緒是需要消耗系統資源的,因為線上程之間切換需要花時間。 所以可以利用下面的程式碼來實現這個功能。 private Runnable mAction

php編如何避免調用in_array()函數出錯問題

小寫 bool php開發 編碼 發布 都是 類型 科技 匹配 php開發過程中,經常會遇到判斷一維數組中是否含有某個元素,這是會用到in_array();由於php是弱類型的語言,所以不小心的話,也會踩到“坑”。(註:這裏測試用到的php版本是5.6。)那麽具體該如何註意

java threadlocal以及線上池場景的應用

  http://www.cnblogs.com/dolphin0520/p/3920407.html https://www.cnblogs.com/coshaho/p/5127135.html https://www.cnblogs.com/gscq073240/articles/6420

你一定會需要的FutureTask線上應用和原始碼解析

FutureTask 是一個支援取消的非同步處理器,一般線上程池中用於非同步接受callable返回值。 主要實現分三部分: 封裝 Callable,然後放到執行緒池中去非同步執行->run。 獲取結果-> get。 取消任務-> cancel。 接下來主

09-佇列:佇列線上池等有限資源池的應用

我們向固定大小的執行緒池請求一個執行緒時,如果執行緒池中沒有空閒資源了,這個時候執行緒池如何處理這個請求?是拒絕請求還是排隊請求?各種處理策略又是怎麼實現的呢? 如何理解"佇列"? 可以理解成排隊買票 佇列最基本的操作也是兩個:入隊 enqueue(),放

算法系列-佇列:佇列線上池等有限資源池的應用

整理自極客時間-資料結構與演算法之美。原文內容更完整具體,且有音訊。購買地址: 1.如何理解佇列 佇列可以把它想象成排隊買票,先來的先買,後來的人只能站末尾,不允許插隊。先進者先出,這就是典型的“佇列”。 佇列跟棧非常相似,支援的操作也很有限,最基本的操作也是兩個:入隊 enq

09 佇列:佇列queue線上池等有限資源的應用

總結:佇列最大的特點就是先進先出,主要的兩個操作是入隊和出隊。跟棧一樣,它即可以用陣列來實現,也可以用連結串列來實現。用陣列實現的叫順序佇列,用連結串列是實現的叫鏈式佇列。特別是長的像個環的迴圈佇列。在陣列實現佇列的時候,會有陣列搬移操作,要解決資料搬移的問題,就需要迴圈