我在使用控件CSTRING变量取得值.传入到线程取值正确
在全局过程里传一个CSTRING变量到线程时取值错误.为什么?我想可能是全局变量执行完成.变量不存在.又如果解些问题吗?
听说可以使用SENDMESSAGE.知道的先能不能简单讲一下.
在全局过程里传一个CSTRING变量到线程时取值错误.为什么?我想可能是全局变量执行完成.变量不存在.又如果解些问题吗?
听说可以使用SENDMESSAGE.知道的先能不能简单讲一下.
解决方案 »
- 求高手指点Runtime error到底是什么错误?
- 在static控件上用textout()
- 程序崩溃
- [求助]想精确实现第1050ms时执行某一函数,怎么办?(同时,有其它线程在运行)
- 有关CByteArray的一个小问题
- MFC80.dll比MFC42.dll多了些什么啊?MFC的架构应该不会变吧?
- 哪个效率高?
- 求多边形形心坐标算法
- VK_C没有定义???
- 一个初学者的问题。。。
- Mysql问题:前台VC做的,后台是Linux环境下的Mysql服务器。连接Mysql服务器时出现Can''t connect to local MySQL server。而在后台
- 请问有何问题!!!我想生成一个螺旋路径,多谢
只要控件的实例还在,传入线程应该没有问题**在全局过程里传一个CSTRING变量到线程时取值错误.为什么?**
在过程中定义的CString变量(不是用 new),在出过程后即被释放,线程可能在该过程结束后执行,可能会出错
HANDLE hExit; //表示请求线程退出的事件DWORD CALLBACK ThreadProc(LPVOID p)
{
MSG msg;
CString *pText;
while (WaitForSingleObject(hExit,100)==WAIT_TIMEOUT)
{
if (PeekMessage(&msg,0,WM_PROCESSSTRING,WM_PROCESSSTRING,PM_REMOVE))
{
pText = (CString *)msg.lParam;
MessageBox(NULL,*pText,TEXT("线程取得CString"),MB_OK);
SetEvent(hProcessed); //表示线程已经处理完消息
}
}
return 0;
}
void CstringView::OnBnClickedPostmessage()
{
CString str; UpdateData();
str = m_strText; //取得控件的CString变量 ResetEvent(hProcessed);
//给线程发消息
PostThreadMessage(m_dwThreadID,WM_PROCESSSTRING,0,(LPARAM)&str);
//无限等待线程处理完消息
WaitForSingleObject(hProcessed,INFINITE);
}至于启动线程,创建事件,关闭线程句柄和事件句柄的代码就不用我写了吧。
向线程发送消息要作一个循环,因为不一定一次能发送成功
while(!PostThreadMessage(m_dwThreadID,WM_PROCESSSTRING,0,(LPARAM)&str))
{
Sleep(10);
}
怎样解决呢?线程中过程如何传参数进去呢?
CSring strVal;
.../*other struct member*/
}MyParam;DWORD WINAPI MyThreadProc(LPVOID param)
{
MyParam* pmp = (MyParam*)param;
.../*you codeing using pmp->strVal*/ ...
}
/*主线程内把要使用的要用地字符串赋给结构*/
MyParam *pmp = (MyParam*)calloc(1,sizeof(MyParam));
pmp->strVal = _T("Hello"); /*you master window handle*/
.../*创建线程是把参数传进去*/
DWORD dwid;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,(void*)pmp,0,&dwid);