在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);
/*...*/
}
高手帮个忙,看看是什么问题
主要代码如下。
// 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);
/*...*/
}
如果异常用GetLastError察看错误代码
再分析或者线程已经创建了,只是运行完了退出了
这个你可以看一下debug窗口中是否有thread exit来判断
^
|
WINAPI
^
|
WINAPI
^
|
WINAPI
如果异常用GetLastError察看错误代码
再分析或者线程已经创建了,只是运行完了退出了
这个你可以看一下debug窗口中是否有thread exit来判断
--------------------------------------------------------
dwThreadId的值没错,进程还是执行了,我看到了,谢谢
但是可能ThreadFun里面的代码有问题,进入运行到一处,就跳出一个对话框
说
The Thread 0x02c0 has exited with code 0.这个含义是不是说线程意外被中止了?
谢谢啊
^
|
WINAPI
---------------------------------
不是WINAPI的问题,我觉得
∧
↑
WINAPI
∧
↑
WINAPI
∧
↑
WINAPI
但单步跟踪了一下执行的顺序,发现这样一个现象
在 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 事件下 编写的创建 线程的 代码,
所以,出现了上面的一些东西吧
大家有什么高见没有?谢谢!!
2、DWORD WINAPI ThreadFun(LPVOID lpParam)——不要丢掉“WINAPI”!有没有WINAPI,生成的代码是有差别的;ps. 线程创建好后,并不会立即执行,而是处于就绪态,等待调度。所以,你跟踪的结果并不奇怪。
不过鉴于你是mfc程序,还是用AfxBeginThread比较好。它内部有一些mfc的处理代码。
不过在使用时,注意AfxBeginThread的参数,一开始要suspend,然后在返回的CThread对象中,把autodelete这个flag设为false,最后再resume让它执行。
因为线程可能一瞬间就好了,这时如果autodelete为true的话,CThread对象自动被delete了,指针就悬空了。同样也就不能再waitforsingleobject了,所以还是自己delete指针比较好