我定义了一个结构:typedef struct tagCOMPILEINFO {
CMainFrame* lpMainWnd;
TCHAR* lpCommandLine;
} COMPILEINFO, *LPCOMPILEINFO;
线程函数:UINT CompileThread(LPVOID lpParam)
{
LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
::OutputDebugString(lpInfo->lpCommandLine);
//为了方便叙述,我用简单的语句作为示例
主函数中调用: COMPILEINFO CompileInfo;
CompileInfo.lpMainWnd = this;
CompileInfo.lpCommandLine = TEXT("test string");
AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);
调试的时候,那个字符串总是空的,任何地方引用字符串lpInfo->lpCommandLine都会发生访问违规……
我看不出上面的代码有什么问题,请高手指教。谢谢。另外问一下,如何获取由AfxBeginThread函数创建的线程的句柄。因为我要用WaitForSingleObject函数来等待它?貌似AfxBeginThread返回的是一个CWinThread类。
CMainFrame* lpMainWnd;
TCHAR* lpCommandLine;
} COMPILEINFO, *LPCOMPILEINFO;
线程函数:UINT CompileThread(LPVOID lpParam)
{
LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
::OutputDebugString(lpInfo->lpCommandLine);
//为了方便叙述,我用简单的语句作为示例
主函数中调用: COMPILEINFO CompileInfo;
CompileInfo.lpMainWnd = this;
CompileInfo.lpCommandLine = TEXT("test string");
AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);
调试的时候,那个字符串总是空的,任何地方引用字符串lpInfo->lpCommandLine都会发生访问违规……
我看不出上面的代码有什么问题,请高手指教。谢谢。另外问一下,如何获取由AfxBeginThread函数创建的线程的句柄。因为我要用WaitForSingleObject函数来等待它?貌似AfxBeginThread返回的是一个CWinThread类。
或者直接写成
TCHAR lpCommandLine[250];
AfxBeginThread 函数返回 CWinThread*,这个指针里面有线程的Handle。
COMPILEINFO *CompileInfo = new COMPILEINFO;
试试
CWinThread有个句柄成员m_hThread
#include <windows.h>
using namespace std;typedef struct tagCOMPILEINFO {
char* lpMainWnd;
TCHAR* lpCommandLine;
} COMPILEINFO, *LPCOMPILEINFO;DWORD WINAPI ThreadProc( LPVOID lpParam )
{
LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
cout<<lpInfo->lpCommandLine<<endl;
//::OutputDebugString(lpInfo->lpCommandLine);
//为了方便叙述,我用简单的语句作为示例
cout<<"Thread end"<<endl;
return 0;
}int main(void)
{
COMPILEINFO test;
test.lpCommandLine = new char[10];
::memcpy(test.lpCommandLine, "Test", 5);
DWORD ThreadId;
HANDLE h;
h = ::CreateThread(NULL, 0, ThreadProc, &test, 0, &ThreadId);
::WaitForSingleObject(h, INFINITE);
CloseHandle(h);
return 0;
}
说了只是个测试
COMPILEINFO CompileInfo;
CompileInfo.lpMainWnd = this;
CompileInfo.lpCommandLine = TEXT("test string");
AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);
你这个问题在于CompileInfo的生命周期是不是比线程的长!!!
如果在AfxBeginThread后没有阻塞,函数直接退出的话就会出现上面的问题。11楼的没有出现你的那个问题是因为线程起来后在等待线程退出才向下 COMPILEINFO test;
test.lpCommandLine = new char[10];
::memcpy(test.lpCommandLine, "Test", 5);
DWORD ThreadId;
HANDLE h;
h = ::CreateThread(NULL, 0, ThreadProc, &test, 0, &ThreadId);
::WaitForSingleObject(h, INFINITE); // 如果没有这句就和你那样有一样的问题
处理: LPCOMPILEINFO lpCompileInfo = new COMPILEINFO;;
lpCompileInfo->lpMainWnd = this;
lpCompileInfo->lpCommandLine = TEXT("test string"); // 这个你这样定义字符常量没问题// 或者重新分配内存再赋值
//--------------------------
lpCompileInfo->lpCommandLine = new TCHAR[32];
memset(lpCompileInfo->lpCommandLine, 0, 32);
_tcscpy(lpCompileInfo->lpCommandLine, TEXT("test string"));
//--------------------------
AfxBeginThread((AFX_THREADPROC)&CompileThread,(LPVOID)&CompileInfo);// 线程函数,需要释放内存
UINT CompileThread(LPVOID lpParam)
{
LPCOMPILEINFO lpInfo = (LPCOMPILEINFO) lpParam;
::OutputDebugString(lpInfo->lpCommandLine); // ……
// 如果字符串是new出来的也需要释放
// ----------------
delete[] lpInfo->lpCommandLine;
lpInfo->lpCommandLine = NULL;
// ----------------
// 释放传进来的参数
delete lpInfo;
lpInfo = NULL;
}
MSDN查一下CWinThread就知道了
CWinThread有一个公开的类变量HANDLE m_hThread;
你等待这个就可以了