当按下 ID_OK 时, Thread 函数 从何时开始执行?0. DWORD WINAPI Thread(LPVOID lpvParam) //需要执行的线程函数
{
//do something return(0);
}
....1. void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
2. {
3. switch (id)
4. {
5. case IDOK: //创建一个线程:
6. hThread =(HANDLE)_beginthreadex(0, 0,Thread,(LPVOID)lpParam, 0, &dwThreadId);
7. CloseHandle(hThread);8. break; //可以肯定 从创建至此 Thread函数 不会执行 case IDCANCEL:
break;
11. }12. } ....14. BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam)
{
15. switch (uMsg)
{16. case (message):
17. return (SetDlgMsgResult(Dlg_OnCommand(hwnd,
LOWORD(wParam),
(HWND)lParam,(UINT)HIWORD(wParam))));
18. }
19. return(FALSE);20. }
....
{
//do something return(0);
}
....1. void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
2. {
3. switch (id)
4. {
5. case IDOK: //创建一个线程:
6. hThread =(HANDLE)_beginthreadex(0, 0,Thread,(LPVOID)lpParam, 0, &dwThreadId);
7. CloseHandle(hThread);8. break; //可以肯定 从创建至此 Thread函数 不会执行 case IDCANCEL:
break;
11. }12. } ....14. BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam)
{
15. switch (uMsg)
{16. case (message):
17. return (SetDlgMsgResult(Dlg_OnCommand(hwnd,
LOWORD(wParam),
(HWND)lParam,(UINT)HIWORD(wParam))));
18. }
19. return(FALSE);20. }
....
6. hThread =(HANDLE)_beginthreadex(0, 0,Thread,(LPVOID)lpParam, 0, &dwThreadId);
7. CloseHandle(hThread);8. break; //可以肯定 从创建至此 Thread函数 不会执行楼主,搞清楚多线程的概念。
从宏观上说两个线程从6行就开始了!!
是你在7行上close的。
当按下 ID_OK 时,线程被创建后就进入了执行队列。
接下来,操作系统根据队列调度法则决定他的执行。如果系统非常空闲可以是立即执行,系统繁忙可以在n秒之后开始执行。每次运行都可以不同。
return(0);足够了。
{
switch (uMsg)
{
case WM_INITDIALOG:
.....
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
Thread = chBEGINTHREADEX( NULL,0,Thread2,(LPVOID)hwnd, 0, &ids);
// CloseHandle(Thread); 有没有无所谓,不影响。只是规范写法而已
Sleep(5000);//★
break;
case IDCANCEL:
......
break;
}
Sleep(5000);//★
}
return(FALSE);
}
现在我想问的是:为什么在执行完整个Dlg_Proc 后,线程才开始执行?
因为 系统白白在两个★处等了10秒 而没有做任何事,说明线程只是初始化,而没有运行线程函数? 那么线程函数的开始时机是什么呢?为何非要等窗口过程退出后才开始执行?