本帖最后由 jamseyang 于 2009-12-24 17:19:05 编辑

解决方案 »

  1.   

    问题1、为什么会多出二个窗口msctfime ui和ime. 
    ==================
    这个可能不对,VC生成的Hello World程序只有一个线程,没有多个线程问题3、WndProc回调函数是由系统调用的,那么它的ThreadID应该是属于系统进程的,但事实却是和主线程的ThreadID相等的 
    ======================================
    这段没看明白,WndProc只是一个函数,并不是一个线程,哪有什么ThreadID啊?问题4、此程序中WndProc和_tWinMain虽然同属一个线程,但看似好象是不同的线程,当响应WM_CHAR消息时弹出消息框WndProc函数暂停,主线程好象不受任何影响,我认为这是属于函数的递归调用,不知道我说的还对
    ======================================
    这里只一个线程,没有多个线程,当没有消息时,线程停在while ( GetMessage(&msg, NULL, 0, 0))处,由于GetMessage当没有消息时会将控制权交回系统,所以这时线程处于就绪状态。当有消息来时,GetMessage获取消息,调用TranslateMessage(&msg);DispatchMessage(&msg);进行消息翻译和分配,然后系统会调用WndProc进行处理。由于这个程序中只有一个消息循环,所以没有递归的问题,当时WndProc确实会出现递归调用的时候。
      

  2.   


    1、可是我的机器上的Hello World确实出现了2个线程,3个窗口呀,有人说是因为我机器是双核CPU,但是我的控制台程序只有1个线程呀!3、可是WndProc并不是自己调用的呀?是系统调用的!!!
      

  3.   

    1、可是我的机器上的Hello World确实出现了2个线程,3个窗口呀,有人说是因为我机器是双核CPU,但是我的控制台程序只有1个线程呀! 
    ===========
    我用spy++看了下,只有一个线程,也只有一个窗口,你所说的ime是输入法编辑器,msctfime应该也和输入法有关,并不是你的程序产生的窗口和线程3、可是WndProc并不是自己调用的呀?是系统调用的!!!
    ==========
    WndProc是回调函数,由系统负责调用,但是它还是在主线程中执行的,并没有为这个函数开启另一个线程。
      

  4.   

    ime好像是输入法的吧,你应该是打开了输入法窗口
    线程也是输入法的线程
      

  5.   


    既然是一个线程,那就应该是顺序执行的。但是现在的问题是:当按键盘时WndProc函数弹出消息框,此时线程应该在此处停止,但是WinMain函数还在不断地GetMessage,主窗口仍然可以响应消息,这明明不是在顺序地执行吗!
      

  6.   

    既然是一个线程,那就应该是顺序执行的。但是现在的问题是:当按键盘时WndProc函数弹出消息框,此时线程应该在此处停止,但是WinMain函数还在不断地GetMessage,主窗口仍然可以响应消息,这明明不是在顺序地执行吗!
    =============
    不好意思,我并没有看你的代码,所以对你的问题没有认真回答,对于一个线程来说,确实是顺序执行的,当WndProc调用MessageBox弹出对话框时,由于MessageBox弹出的模态对话框,模态对话框内部是有一个消息循环的,也就是说MessageBox弹出的对话框内部有一个GetMessage来接替主线程的GetMessage来接收消息,这里WndProc还是可以处理下一个消息,这个叫WndProc的重入,不是递归。
      

  7.   


    可以详细解释下WndProc的重入吗?不明白呀!!
      

  8.   

    WndProc就是窗口过程函数,响应消息的。
      

  9.   

    main函数里面的是主消息循环,
    弹出的模式对话框里面会起第二个循环来接受主消息循环中的消息。
    所以主消息循环没有被阻塞,
    WndProc好像可以当作main中主消息循环中的DispatchMessage(&msg)里面调用的来看。
      

  10.   

    可以详细解释下WndProc的重入吗?不明白呀!!
    ==========
    重入很简单的,就是当第一个WndProc还没有执行完时,这个函数又被调用了,有点接近递归,不过递归总是间接或是直接的由自身调用自身。
      

  11.   

    wltg2001,不是重入!DispatchMessage(&msg)---->DialogBox()DialogBox中启动消息循环,将所有消息发送的各个窗口,所以主窗口的窗口函数才能继续执行弹出消息框的确只有一个线程顺序的执行,DispatchMessage必须要等待窗口函数执行结束后才可以返回.