none
是不是使用了windows函数就会增加一个windows线程? RRS feed

  • 问题

  • 在一个简单的控制台程序中,如下

    int main(int argc, TCHAR *argv[])
    {
       MessageBox(NULL, (LPCTSTR)L"很好", TEXT("Error"), MB_OK);
       return 0;
    }


    用任务管理器观察是两个线程,用断点thread窗口看也是两个,一个是crt线程,一个是win32线程;
    如果注释掉
    MessageBox,就只有crt线程了.

    很奇怪,windows函数为什么要占用一个线程, 谁能解说下这里面的机制原理吗?

    2008年11月27日 7:28

答案

全部回复

  • 我觉得是MessageBox需要一个窗口线程来处理消息循环。你的主线程是工作线程,无法处理消息循环。

    2008年11月27日 7:51
    版主
  • 我不用MessageBox,使用GetLastError也会产生一个WINDOWS线程,这如何解释,这可不是窗口线程.
        DWORD dw = GetLastError();

    2008年11月27日 7:56
  • 搞错了,单使用GetLastError是不会产生windows线程,只有使用了带窗口的函数如MessageBox,或其它? 才会专门产生一个线程; 但是如果MessageBox只是在调用函数中定义,实际工作线程不调用,怎么也产生了windows线程.难道编译时,就已经标识了....

    Code Snippet

    void ErrorHandler(LPTSTR lpszFunction);

    int main(int argc, TCHAR *argv[])
    {
    return 0;
    }
    void ErrorHandler(LPTSTR lpszFunction)
    {

    MessageBox(NULL, (LPCTSTR)L"很好", TEXT("Error"), MB_OK);
    }
    //一个crt线程,一个windows线程.




    不知道在那些情况下,会产生windows线程?
    2008年11月27日 8:05
  •  

    MessageBox是系统定义的函数,它产生的线程根系统有关系。
    2008年11月27日 9:15
    版主
  • 肯定不会说使用WindowAPI就会产生线程,
    但像MessageBox这样的难说, 它会新起一起窗口,
    不排除新起线程来处理消息循环
    2008年11月28日 1:44
    版主