多线程问题:为什么没有调用线程函数(弄了四五天了,头晕)
在开发一个引擎,其中定义了一个线程类,想用它来完成一些计算任务,可是调用_beginthreadex后,怎么就进入不了线程函数,所以根本就无法完成计算任务;而且还有个很诡异的现象,就是,我把这个类单独拿出来,新建一个工程进行测试,可以完成任务,一点问题都没有。我的问题就是为什么没有调用线程函数,各位大侠帮帮忙,小弟谢谢了。下面贴代码:
//定义线程的.h文件MultiThreading.h
#include <Windows.h>
#include <process.h>
typedef unsigned int (WINAPI *PBEGINTHREADEX_THREADFUNC) (LPVOID lpThreadParameter);
typedef unsigned *PBEGINTHREADEX_THREADID;
//线程类
class Thread
{
public:
Thread(T_Geom* g1, T_Geom* g2, T_CDGeomFilterMsg* cdgf, T_Space* sp, int id);
virtual ~Thread();
void StartThread();
void WaitForExit();
//线程函数
static unsigned int WINAPI ThreadFunc(LPVOID param);
protected:
//由线程函数调用,完成相应的计算工作
DWORD ThreadMemberFunc();
public:
HANDLE m_hThread;
unsigned int m_ThreadId;
private:
//计算中所用到的一些数据
T_Geom* geom1;
T_Geom* geom2;
T_CDGeomFilterMsg* pCDGFMsg;
T_Space* pSpace;
};
//定义线程的.cpp文件
#include "stdafx.h"
#include "MultiThreading.h"
Thread::Thread(T_Geom* g1, T_Geom* g2, T_CDGeomFilterMsg* cdgf, T_Space* sp, int id)
{
m_hThread = NULL;
m_ThreadId = id;
geom1 = g1;
geom2 = g2;
pCDGFMsg = cdgf;
pSpace = sp;
}
Thread::~Thread()
{
//release the resource
}
void Thread::StartThread()
{
//创建新线程
m_hThread = (HANDLE)_beginthreadex(
NULL,
0,
(PBEGINTHREADEX_THREADFUNC)Thread::ThreadFunc,
(LPVOID)this,
0,
&m_ThreadId);
}
void Thread::WaitForExit()
{
WaitForSingleObject(m_hThread, INFINITE);
CloseHandle(m_hThread);
}
//线程函数。(问题:在执行_beginthreadex后,为什么没有调用这个函数??????)
unsigned int WINAPI Thread::ThreadFunc(LPVOID param)
{
Thread* pto = (Thread*)param;
return pto->ThreadMemberFunc();
}
//具体完成计算工作
DWORD Thread::ThreadMemberFunc()
{
//do something useful.....
CollisionGeomFilter(geom1, geom2, pCDGFMsg);
CollisionDetection(geom1, geom2, pCDGFMsg, pSpace);
return 0;
}
//创建多线程的.cpp
HANDLE* handle = new Thread(g1, g2, &pCDGFMsg, this, iCounter+1);
handle->StartThread();
在这里创建线程之后,为什么没有调用线程函数,弄了四五天了,使用了各种方法,还是没找到原因,因为_beginthreadex是系统函数,所以没法跟进去,急啊,大侠们,帮忙看看,多谢了
[解决办法]
先sf..
[解决办法]
应该没问题吧;你能确定你其他代码没问题!!?
[解决办法]
那运行到_beginthreadex后程序是什么状态?有没有崩掉或报错!尝试在ThreadMemberFunc里做一些输出,看看到底进去没有,多线程的调试有时不像表面那样!
[解决办法]
学习学习
[解决办法]
从你给的 信息看,StartThread()里面没问题..
[解决办法]
我也看得一头雾水呢帮不了你sorry
[解决办法]
HANDLE* handle = new Thread
HANDLE不是windows的关键字么,怎么你的Thread构造函数返回值居然赋值给HANDLE了,应该是Thread*
吧。
如果还是不行,试试CreateThread吧。
[解决办法]
m_ThreadId为什么要传递一个值进去呢?
我把你的代码简化了一下,是可以调用的。
#include <iostream>using namespace std;#include <Windows.h>#include <process.h>typedef unsigned int (WINAPI* PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter);typedef unsigned* PBEGINTHREADEX_THREADID;// 线程类class Thread{public: Thread(); virtual ~Thread(); void StartThread(); void WaitForExit(); //线程函数 static unsigned int WINAPI ThreadFunc(LPVOID param);protected://由线程函数调用,完成相应的计算工作 DWORD ThreadMemberFunc();public: HANDLE m_hThread; unsigned int m_ThreadId;private:};Thread::Thread(){ m_hThread = NULL;// m_ThreadId = id;}Thread::~Thread(){//release the resource}void Thread::StartThread(){//创建新线程 m_hThread = (HANDLE)_beginthreadex( NULL, 0, (PBEGINTHREADEX_THREADFUNC)Thread::ThreadFunc, (LPVOID)this, 0, &m_ThreadId);}void Thread::WaitForExit(){ WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread);}// 线程函数。(问题:在执行_beginthreadex后,为什么没有调用这个函数??????)unsigned int WINAPI Thread::ThreadFunc(LPVOID param){ Thread* pto = (Thread*)param; return pto->ThreadMemberFunc();}//具体完成计算工作DWORD Thread::ThreadMemberFunc(){ cout << "DWORD Thread::ThreadMemberFunc()" << endl; return 0;}int main(){ Thread* handle = new Thread(); handle->StartThread(); return 0;}
[解决办法]
m_ThreadId是个输出型参数,线程会把值写入这个变量,所以是引用的,这个值不需要初始化。刚没仔细看这个。
[解决办法]
Return ValueIf successful, each of these functions returns a handle to the newly created thread; however, if the newly created thread exits too quickly, _beginthread might not return a valid handle (see the discussion in the Remarks section). _beginthread returns 1L on an error, in which case errno is set to EAGAIN if there are too many threads or to EINVAL if the argument is invalid or the stack size is incorrect. _beginthreadex returns 0 on an error, in which case errno and _doserrno are set.If startaddress is NULL, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions set errno to EINVAL and return -1.For more information about these and other return codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.For more information about uintptr_t, see Standard Types.
[解决办法]
同建议Sleep()一下。我也曾遇到过类似的问题,线程还没来得及执行主线程就执行完退出了。
[解决办法]
其实函数是调用了吧
问题出在主函数main中。
主函数直接退出了,你的线程还没来得工作就结束了。
你在主函数中加一个死循环啥的试一下
------解决方案--------------------
你在你的线程函数中加断点,然后debug调试,看能不能进入线程函数,你的线程函数没执行还有可能是线程函数出错及早返回了。
[解决办法]
首先:工程->设置->c/c++
code generation
Runtime Library设成Multi-threaded Debug DLL (/MDd)
或者Multi-threaded DLL (/MD)
其次,在
int main()
{
Thread* handle = new Thread();
handle->StartThread();
//防止主程序退出
return 0;
}
用while或sleep,我在你的线程函数里输出测试语句是可行的,你也可以先这样测试下,再看看你的线程函数里面的业务逻辑是否有问题。
[解决办法]
MARK.
[解决办法]
你创建线程得主线程在创建完之后干吗了?不会立刻退出了吧?如果主线程退出,所有线程都会被结束
[解决办法]
我大概修改了一下你的程序,没问题:
工程设置:"工程点击右键"-> "c/c++" -> " code generation" -> "Runttime Library"
-> "Multi-threaded Debug DLL (/MDd)"
运行结果:ThreadMemberFunc
程序如下:
#include <Windows.h>
#include <process.h>
#include <iostream>
typedef unsigned (__stdcall * _StartAddress) (void *);
//typedef unsigned *PBEGINTHREADEX_THREADID;
//线程类
class Thread
{
public:
Thread();
virtual ~Thread();
void StartThread();
void WaitForExit();
//线程函数
static unsigned __stdcall ThreadFunc (void *);
protected:
//由线程函数调用,完成相应的计算工作
DWORD ThreadMemberFunc();
public:
HANDLE m_hThread;
unsigned int m_ThreadId;
private:
//计算中所用到的一些数据
// T_Geom* geom1;
// T_Geom* geom2;
// T_CDGeomFilterMsg* pCDGFMsg;
// T_Space* pSpace;
};
//定义线程的.cpp文件
//#include "stdafx.h"
//#include "MultiThreading.h"
Thread::Thread()
{
m_hThread = NULL;
// m_ThreadId = id;
// geom1 = g1;
// geom2 = g2;
// pCDGFMsg = cdgf;
// pSpace = sp;
}
Thread::~Thread()
{
//release the resource
}
void Thread::StartThread()
{
//创建新线程
m_hThread = (HANDLE)_beginthreadex(
NULL,
0,
(_StartAddress)Thread::ThreadFunc,
(LPVOID)this,
0,
&m_ThreadId);
}
void Thread::WaitForExit()
{
WaitForSingleObject(m_hThread, INFINITE);
CloseHandle(m_hThread);
}
//线程函数。(问题:在执行_beginthreadex后,为什么没有调用这个函数??????)
unsigned int WINAPI Thread::ThreadFunc(LPVOID param)
{
Thread* pto = (Thread*)param;
return pto->ThreadMemberFunc();
}
//具体完成计算工作
DWORD Thread::ThreadMemberFunc()
{
//do something useful.....
std::cout << "ThreadMemberFunc" << std::endl;
return 0;
}
int main()
{
Thread td ;//= new Thread();
td.StartThread();
td.WaitForExit();
}
[解决办法]
呵呵,应该是这个模块和别的模块那里有冲突导致没有调用
[解决办法]
友情帮顶。
[解决办法]
管你是不是实时计算,因为可能你开的线程还没执行,主函数就结束了。所以你还是在主函数return前加个死循环或者其它试试,看效果就知道了。最好先去掉你线程里面的计算功能,用输出语句测试之,再看是否是你计算功能的问题。
[解决办法]
应该是主线程over的原因
[解决办法]
//线程函数
static unsigned int WINAPI ThreadFunc(LPVOID param);