【发布时间】:2013-12-06 20:16:10
【问题描述】:
看看这段代码:
// Function that start the thread
...
data = (PWTools::Data*)malloc(sizeof(PWTools::Data));
data->aParam1 = aParam1;
data->dataSourceName = pwTools.GetActiveDataSourceName(); //This function returns a LPWSTR
CWinThread* thread = AfxBeginThread(DeleteDocument, (LPVOID)data, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
...
在上面的第 3 行之后,数据被正确填充,没有问题。但是在第 4 行之后,就在调用 AfxBeginThread 之后,data->dataSourceName 被损坏并获得了一个无意义的值。我试图在 GetActiveDataSourceName 方法中获取代码并将其放入上面的代码中,一切正常。但我不想以这种方式解决它。为什么会发生?提前致谢!
【问题讨论】:
-
AfxBeginThread() 有两种形式,你调用的是我认为的五参数版本:msdn.microsoft.com/en-us/library/s3w9x78e.aspx
-
向我们展示 DeleteDocument 函数。如果您修改 DeleteDocument 以使其不执行任何操作而直接返回,会发生什么情况?我敢打赌 data->dataSourceName 不会再被破坏了。可能 DeleteDocument 函数会处理数据。
-
是的,我用的是五参数函数。这有什么问题吗,奥克代尔?
-
data->dataSourceName 在进入 DeleteDocument 线程函数之前已损坏。我知道它是因为我创建了暂停的线程,并且它仅在我恢复它时才开始。因此,我调用 AfxBeginThread,数据-> dataSourceName 已损坏,并且就在我在线程中调用 resume 之后。无论如何,这里是 DeleteDocument 函数: ... PWTools::Data filledData;填充数据 = (PWTools::Data)malloc(sizeof(PWTools::Data));填充数据 = (PWTools::Data*) 数据; ...在上面的代码中,data->aParam1 是可以的,但是 data->dataSourceName 已损坏。
-
CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);那么 pParam 在哪里呢??
标签: c++ multithreading mfc