在VC6环境下编程,调试的时候选择 DEBUG->THREADS,并没有发现新创建的线程,很郁闷
高手帮个忙,看看是什么问题
主要代码如下。
// A.h 文件
class A

  /*...*/
public:
  creat(); // 用来创建一个线程
 /*...*/
private:
  SOCKET s; // 传递给线程的参数
};// A.cpp 文件
#include "A.h"
/*...*/DWORD ThreadFun(LPVOID lpParam); // 线程调用的函数A::create()

  DWORD dwThreadId;
  HANDLE hThread;
  hThread = CreateThread(NULL, 0, 
                       reinterpret_cast<LPTHREAD_START_ROUTINE>(ThreadFun), 
                        &s, 0, &dwThreadId);
}DWORD ThreadFun(LPVOID lpParam)
{
   SOCKET sock;
   sock = reinterpret_cast<SOCKET>(lpParam);
   /*...*/
}

解决方案 »

  1.   

    察看一下dwThreadId值
    如果异常用GetLastError察看错误代码
    再分析或者线程已经创建了,只是运行完了退出了
    这个你可以看一下debug窗口中是否有thread exit来判断
      

  2.   

    怎么感觉你的线程调用函数好别扭啊。直接根据MSDN中的定义方式使用就很好了。另外,设一下断点试一试,看有没有进去。
      

  3.   

    DWORD    ThreadFun(LPVOID lpParam); // 线程调用的函数
          ^
       |
        WINAPI
      

  4.   

    DWORD                  ThreadFun(LPVOID lpParam); // 线程调用的函数
                 ^
              |
              WINAPI
      

  5.   

    DWORD                  ThreadFun(LPVOID lpParam); // 线程调用的函数
                      ^
              |
              WINAPI
      

  6.   

    察看一下dwThreadId值
    如果异常用GetLastError察看错误代码
    再分析或者线程已经创建了,只是运行完了退出了
    这个你可以看一下debug窗口中是否有thread exit来判断
    --------------------------------------------------------
    dwThreadId的值没错,进程还是执行了,我看到了,谢谢
    但是可能ThreadFun里面的代码有问题,进入运行到一处,就跳出一个对话框

    The Thread 0x02c0 has exited with code 0.这个含义是不是说线程意外被中止了?
    谢谢啊
      

  7.   

    DWORD   ThreadFun(LPVOID lpParam); // 线程调用的函数

       |
     WINAPI
    ---------------------------------
    不是WINAPI的问题,我觉得
      

  8.   

    DWORD                  ThreadFun(LPVOID lpParam); // 线程调用的函数
                 ∧
              ↑
              WINAPI
      

  9.   

    DWORD                  ThreadFun(LPVOID lpParam); // 线程调用的函数
                   ∧
              ↑
              WINAPI
      

  10.   

    DWORD                  ThreadFun(LPVOID lpParam); // 线程调用的函数
                     ∧
              ↑
              WINAPI
      

  11.   

    我是楼主我发现进程是执行了
    但单步跟踪了一下执行的顺序,发现这样一个现象
    在  CreateThread(...) 函数执行完毕以后,程序并没有立即跳到 线程函数 ThreadFun()中运行,而是这个循序CreateThread() 
     => AFX_STATIC BOOL AFXAPI _AfxDispatchCmdMsg() // CCmdTarget windows message dispatching
     => BOOL CCmdTarget::OnCmdMsg()
     => BOOL CDialog::OnCmdMsg()
     => BOOL CWnd::OnCommand()
     => LRESULT CWnd::WindowProc()
     => LRESULT AFXAPI AfxCallWndProc // Official way to send message to a CWnd
     => LRESULT CALLBACK AfxWndProc()
     => LRESULT CALLBACK AfxWndProcBase()
     => ThreadFun上面的跟踪好像在完成消息的处理我认为,可能是由于我是在 COMMAND_BUTTON 的CLICK 事件下 编写的创建 线程的 代码,
    所以,出现了上面的一些东西吧
    大家有什么高见没有?谢谢!!
      

  12.   

    CSDN回复次数限制失效_测试10测试完毕
      

  13.   

    1、C++中不要直接使用CreateThread(...),请改用_beginthreadex(...)!不然很可能出错,尤其是使用C库、C++对象等的时候;
    2、DWORD WINAPI ThreadFun(LPVOID lpParam)——不要丢掉“WINAPI”!有没有WINAPI,生成的代码是有差别的;ps. 线程创建好后,并不会立即执行,而是处于就绪态,等待调度。所以,你跟踪的结果并不奇怪。
      

  14.   

    楼上正解。mfc程序默认都是利用多线程runtime的,所以必须使用_beginthreadex或者AfxBeginThread,(其实这个函数内部也是调用_beginthreadex的,看一下mfc的thrdcore.cpp就知道了)
    不过鉴于你是mfc程序,还是用AfxBeginThread比较好。它内部有一些mfc的处理代码。
    不过在使用时,注意AfxBeginThread的参数,一开始要suspend,然后在返回的CThread对象中,把autodelete这个flag设为false,最后再resume让它执行。
    因为线程可能一瞬间就好了,这时如果autodelete为true的话,CThread对象自动被delete了,指针就悬空了。同样也就不能再waitforsingleobject了,所以还是自己delete指针比较好