1. MFC中多線程怎麼調用窗口類成員函數
當前界面的線程
AfxGetThread()返回當前界面線程對象的指針(CWinThread類指針).
其中公共成員保存了窗口指針
m_pMainWnd
保存指向應用程序的主窗口的指針
(CWnd)
m_pActiveWnd
當前大畝活動窗口指針(CWnd)
這樣你就可以調用窗口的方法了.
不過我個人還是覺得拆野你發消息滾御森比較好一些,消息傳遞參數可以通過無符號指針的切換來解決.
2. #請教下 mfc中寫多線程,應該寫在哪個類中,同時mfc的主線程在哪裡,小弟初學 還請指教
MFC里AfxBeginThread()可以創建線程,vc里不管是不是MFC,main(在攔歲win32下是WinMain)函數磨扮代碼就是簡游睜主線程,主線程退出整個進程退出,也可以調用WINDOWS API CreateThread。
3. MFC多線程編程,如何向輔助UI線程中添加控制項消息響應函數
我不知道你說的輔助UI線程,姿毀是否是通過AfxBeginThread創建的CWinThread線程。關於消息響應手豎的問題,不知道你是否按照MFC的要求,建立了必要的類,重載了必要的函數。畢冊大
但我更想說,你這種做法實在太復雜,完全可以在一個線程中完成的事情,何必放在兩個線程里!!只要簡單地在主窗口對話框中,創建一個定時器,就完全可以實現你需要的功能。
4. MFC中如何讓多線程按先後順序執行,第一個來的先執行,以後按先後到達的順序執行
多線程處理這類問題可以用各種信號量或者鎖解決,本質上原理都是很類似的,這里介紹一下事件信號薯搭冊量,另外還有互斥量,就把CreateEvent換成CreateMutex就可以了。
先說一下WaitForSingleObject這個函數,如果參數1現在是有信號的,那麼這個函數立刻返回WAIT_OBJECT_0,如果當前是無信號的,會卡死在這個函數上面,會一直等待,參數2指定最大等待時間,如果參數2不是INFINITE並且時間以到則返回超時,下面具體方法:
在恰當的位置定義:
HANDLE g_hWait;
g_hWait = CreateEvent( NULL , TRUE , TRUE , NULL );//創建一個初始為數宏有信號的事件量
線程枝埋函數
{
DWORD dWait = WaitForSingleObject( g_hWait , 3000 );//最多等待3秒,也可以是INFINITE無限等待
if( WAIT_OBJECT_0 != dWait )
{
//說明這是第一個線程或者前一個線程已經處理完成並且做了SetEvent( g_hWait );
ResetEvent( g_hWait );//轉為無信號狀態,其他線程在WaitForSingleObject會等待
開始幹活
SetEvent( g_hWait );//轉為有信號狀態,其他線程的WaitForSingleObject會返回WAIT_OBJECT_0
}
}
5. mfc如何使用多線程搜索文件夾
1、根據API中的文件和目錄操作函數構成一個具有遞歸功能的目錄念彎鍵遍歷和文件查找
2、可以根鬧橋據MFC中對線程的封裝格式,將上述操作放入仔巧線程函數中
3、更多交流參考我空間文章。
6. 求大神指導MFC多線程編程。進度條那種就行。我按照網上的例子運行出來
我用的BOOST庫中的線程庫滑胡
void CTestBoost::OnBnClickedBtntestboost()
{
// TODO: 在此添加控制項通知處理程序代碼
UINT length = 500;
m_wndProgress.SetRange(0, length);
m_wndProgress.SetStep(1);
m_wndProgress.SetPos(0);
boost::thread t(boost::bind(&CTestBoost::RunTest, this, length));
t.detach();//將子嘩模線程和主線程分離,子線程執行完成後自己釋放資源
}
void CTestBoost::RunTest(UINT length)
{
for(size_t i=0;i<length;i++)
{
m_wndProgress.SetPos(i);
Sleep(2);
}
MessageBox(_T("完成"),_T("亂讓緩提示"),MB_ICONINFORMATION);
GetDlgItem(IDC_BTNTESTBOOST)->EnableWindow(TRUE);
runState=0;
}
7. MFC 多線程進度對話框
第一個問題,可以有兩種方法:
1. 用全局變數來傳遞信息,在新線程中如果對話框被取消,給該全局變數賦一個值,在主線程傳輸文件過程中判斷該變數的值,如果是取消了,則主線程取消文件傳輸。
2. 用自定義消息,在新線程中如果對話框被取消,就向主線程所在窗體發送消息,在主線程中創建一個處理該銀中賣消息的函數實現相應的功能即可。
第鋒逗二個問題,原因可能是這樣的:在主線程中定義對話框dlg,在新線程中dlg.domodal,然後在主線程修改,但問題是要保證主線程和新線程嚴格按照設定的順序來執行。在主線程中啟動新線程之後,主線程仍然在執行,有可能新線程中dlg.domodal還沒執行,主線程dlg.m_pro.setpos已經執行過了,所以會出問題,加入AfxMessageBox之後在彈出窗口沒有關閉之前主線程沒有繼續往下執行,這就使新線程有足夠的時間執行dlg.domodal,所以能夠培燃執行成功。你可以在主線程建立對話框並啟動新線程之後延時一段時間,再執行dlg.m_pro.setpos。
8. MFC中,怎樣利用多線程和回調函數,從串口調試助手中接收數據,然後在編輯框中顯示出來
你在你的串口類SerialPort裡面加一個線程函數或者回調函數private函數:
static DWORD WINAPI ReceiveData(LPVOID lpParam); //線程函數
static WORD ProcessReceiveData(void* data);
void ProcessData(DWORD (*Func)(void*) ); //回調函數
然後再你接收數據的地方創建一個線程或者回調函數來處理你從串口接收到的數據:
CreateThread(NULL, 0, ReceiveData, this(或者你傳入的參數) ,NULL, 0);//忘記了函數參數啊 或握枯者
ProcessData(ProcessReceiveData);
最後將該數據在編輯框中顯示出來就可以了
(CEdit*)GetDlgItem(和伏ID_xxx)->段棚洞SetWindowsText("DATA");
只是提供一個思路
9. mfc創建線程的三種方法
MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在於工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。
工作者線程沒有消息機制,通常用來執行後台計算和維護任務,如冗長的計算過程,列印機的後台列印等。用戶界面線程一般用於處理獨立於其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對於Win32的API編程而言,這兩種線程是沒有區別的,它們都只需線程的啟動地址即可啟動線程來執行任務
1、WIN的API函數CreateThread
HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, // SD
DWORDdwStackSize, // initial stack size
LPTHREAD_START_ROUTINElpStartAddress, // thread function
LPVOIDlpParameter, // thread argument
DWORDdwCreationFlags, // creation option
LPDWORDlpThreadId // thread identifier
);
//lpThreadAttributes:指向SECURITY_ATTRIBUTES型態的結構的指針。在Windows 98中忽略該參數。在Windows NT中,它被設為NULL,表示使用預設值。
dwStackSize,線程堆棧大小,一般=0,在任何情況下,Windows根據需要動態延長堆棧的大小。
lpStartAddress,指向線程函數的指針,形式:@函數名,函數名稱沒有限制,但是必須以下列形式聲明:
DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正確將無法調用成功。
lpParameter:向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULL。
dwCreationFlags :線程標志,可取值如下
(1)CREATE_SUSPENDED-----創建一個掛起的線程,
(2)0---------------------------------表示創建後立即激活。
lpThreadId:保存新線程的id。
2、MFC的全局函數AfxBeginThread
CWinThread* AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );
//用於創建工作者線程 其中pfnThreadProc指向線程函數 pParam為傳遞給線程函數的參數
CWinThread* AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );
//用於創建用戶界面線程 其中pThreadClass為CWinThread派生對象的RUNTIME_CLASS
3、MFC的CWinThread類的CreateThreat成員函數
BOOL CreateThread( DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
//CWinThread類支持工作者線程和用戶界面線程 可以將一個CWinThread派生類的CRUNTIMECLASS的指針作為參數傳遞給AfxBeginThread函數以創建一個用戶界面線程 CWinThread類的CreateThread成員函數創建一個調用進程的地址空間中執行的線程
VC 6.0 創建線程的三種方法
CreateThread/ExitThread
_beginthreadex/_endthreadex
AfxBeginThread /AfxEndThread
對以上三種方式的選擇:
1.在使用了MFC的程序中使用AfxBeginThread函數或者CWinThread::CreateThread函數創建線程。
2.在非MFC工程中,如果要創建多線程,建議使用_beginthreadex
3.避免使用CreateThread函數。不使用_beginthread.
4.線程內部退出函數使用與創建函數配套的函數。
10. 在多線程中如何調用MFC中類的一個函數
創建雹畢線程時將指針作為參數傳入源櫻芹
AfxBeginThread(SendThread, this, NULL);
在線程函數中再強轉頌彎使用
UINT CMainFrame::SendThread(LPVOID pParam)
{
CMainFrame *pThis = (CMainFrame*)pParam;
...
pThis->m_progress.SetPos(ProgressCount);
...
return 1;
}